Това наистина е опорна точка, наричана още кръстосана таблица или понякога транспониране
Някои бази данни имат специални средства за това, други трябва да използвате синтаксис за групиране. Предпочитам последното, защото работи универсално
Ако е някаква утеха, бяхте наистина близо!
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) може да идва от всеки друг ред.. На практика това означава, че се избират единичните стойности, нулевите се изхвърлят, всички те се появяват на един и същи ред..
..и по този начин вашите вертикални данни преминаха хоризонтално, след като преминаха през диагонала