SQLite: тернарная группировка


Автор: Artix (user.su)

Задача:

Есть список объектов с некоторыми параметрами param1,param2,param3
Параметры могут быть булевского типа (Содержать одно из двух значений: Да/Нет)
или же содержать несколько вариантов разных значений (более двух вариантов).
Нужно: вывести список объектов и для каждого параметра объекта указать либо "чистое"
значение параметра (если он всегда одно и то же), либо вывести отметку, что 
параметр содержит разные значения.

Решение:

DROP TABLE IF EXISTS test;

CREATE TABLE test (
    part_id integer,
    param1 text,
    param2 text,
    param3 text
);

INSERT INTO test VALUES (1,'on','true','red');
INSERT INTO test VALUES (2,'on','false','red');
INSERT INTO test VALUES (2,'off','false','red');
INSERT INTO test VALUES (3,'on','true','red');
INSERT INTO test VALUES (3,'off','false','green');
INSERT INTO test VALUES (3,'on','true','blue');

.headers on
.mode column

SELECT * FROM test;

SELECT 
    part_id,
    IIF(MAX(param1)=MIN(param1), MAX(param1), NULL) as param1,
    IIF(MAX(param2)=MIN(param2), MAX(param2), NULL) as param2,
    IIF(MAX(param3)=MIN(param3), MAX(param3), NULL) as param3
FROM test
GROUP BY part_id

Комментарий:

В данном примере, если параметр имеет несколько разных значений - 
в соответствующий столбец выводится NULL. В противном случае -
в столбце остаётся исходное значение.