Это действительно сводная точка, также называемая перекрестной таблицей, или иногда транспонируемая
В некоторых базах данных есть специальные средства для этого, в других вы должны использовать синтаксис группировки. Я предпочитаю последнее, потому что оно работает универсально
Если это утешит, вы были действительно близко!
SELECT
DIM_KEY,
MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY
Как это работает?
Что ж, если вы запустите несгруппированную версию без функций, которая у вас уже была:
SELECT
DIM_KEY,
(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
demo
Тогда вы увидите, что ваши данные станут «диагональными»:
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
В каждом столбце (для каждого dim_key) есть только одно значение, остальные - NULL
Добавление в GROUP BY и MAX приводит к тому, что они сворачиваются в одну строку, потому что MAX () вернет только значение из столбца и заставит все нули исчезнуть. Это внутреннее свойство группировки, что данные строки не «остаются вместе» - в группе определенного DIM_KEY MAX (DAIRY_CLM) может поступать из любой строки, MAX (KOSHER_CLM) может поступать из любой другой строки. На практике это означает, что отдельные значения выбираются, нули отбрасываются, все они появляются в одной строке.
.. и, таким образом, ваши вертикальные данные перешли в горизонтальное положение после прохождения диагонали