Умный способ объединения двух столбцов в SQLite?

Я извиняюсь, если это похоже на код гольф, но я стараюсь избегать извлечения данных из базы данных, выполняю обработку в коде приложения для чего-то, что потребовало бы циклов slooow над набором данных, где есть индексы, которые помогут в группировке.

Есть ли какой-либо способ получить из набора данных, как это:

sqlite> create table tst  (id INTEGER, label TEXT, variable TEXT, value FLOAT);
sqlite> insert into tst values (1,"label1","variable 1",1.2);
sqlite> insert into tst values (1,"label2","variable 2",2.2);
sqlite> insert into tst values (1,"label3","variable 3",3.2);
sqlite> select * from tst;
id          label       variable    value     
----------  ----------  ----------  ----------
1           label1      variable 1  1.2       
1           label2      variable 2  2.2       
1           label3      variable 3  3.2  

должен быть возвращен, как это (с именами выходных столбцов, построенных из содержимого variable а также label содержание столбца):

sqlite> <magic query here> 
id          label1_variable1   label2_variable2    label3_variable3     
----------  ----------         ----------          ----------
1           1.2                2.2                 3.2       

то есть в широком формате, а не в длинном формате?

Пожалуйста, посоветуйте или помогите мне, просто доказав, что это невозможно.

1 ответ

Решение

Вы можете достичь этого, используя сводный запрос:

SELECT id,
    SUM(CASE WHEN label = 'label1' THEN value ELSE 0 END) AS 'label1_variable1',
    SUM(CASE WHEN label = 'label2' THEN value ELSE 0 END) AS 'label2_variable2',
    SUM(CASE WHEN label = 'label3' THEN value ELSE 0 END) AS 'label3_variable3'
FROM tst
GROUP BY id

Вы не можете выполнить сводный запрос в SQLite с неизвестным набором столбцов, потому что для этого потребуется динамический SQL. Как пользователь @CL. упоминается в его комментарии ниже, один из способов имитации динамического SQL будет сначала сделать SELECT DISTINCT label FROM tst чтобы получить набор всех столбцов с последующим сводным запросом, напоминающим то, что я дал выше. Вы должны построить сводный запрос программно из уровня приложения.

Другие вопросы по тегам