Dies ist in der Tat ein Pivot, auch Kreuztabelle oder manchmal Transposition genannt
Einige Datenbanken haben spezielle Einrichtungen dafür, andere müssen Sie eine Gruppierungssyntax verwenden. Ich bevorzuge letzteres, weil es universell funktioniert
Falls es dich tröstet, du warst wirklich nah dran!
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
Wie funktioniert es?
Nun, wenn Sie die nicht gruppierte Version ohne maximale Funktionen ausführen, die Sie bereits hatten:
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
Dann sehen Sie, dass Ihre Daten "diagonal" werden:
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
In jeder Spalte (pro dim_key) gibt es nur einen Wert, der Rest ist NULL
Das Hinzufügen von GROUP BY und MAX führt dazu, dass diese zu einer einzigen Zeile zusammenfallen, da MAX() nur den Wert aus der Spalte zurückgibt und alle Nullen verschwinden lässt. Es ist eine intrinsische Eigenschaft einer Gruppierung, dass die Zeilendaten nicht "zusammenbleiben" - innerhalb der Gruppe eines bestimmten DIM_KEY kann MAX(DAIRY_CLM) aus jeder Zeile stammen, MAX(KOSHER_CLM) aus jeder anderen Zeile. In der Praxis bedeutet dies, dass die einzelnen Werte ausgewählt werden, die Nullen verworfen werden und alle in derselben Zeile erscheinen..
..und somit wurden Ihre vertikalen Daten horizontal, nachdem sie die Diagonale durchlaufen hatten