Questo è davvero un pivot, chiamato anche tabella incrociata, o talvolta trasposizione
Alcuni database hanno strutture dedicate per farlo, altri devi usare una sintassi di raggruppamento. Preferisco quest'ultimo perché funziona universalmente
Se può esserti di consolazione, eri davvero vicino!
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
Come funziona?
Bene, se esegui la versione non raggruppata e senza funzioni massime che avevi già:
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
Quindi vedrai i tuoi dati diventare "diagonali":
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
In ogni colonna (per dim_key) c'è un solo valore, il resto è NULL
L'aggiunta di GROUP BY e MAX fa sì che questi vengano compressi in una singola riga perché MAX() restituirà solo il valore dalla colonna e farà scomparire tutti i null. È una proprietà intrinseca di un raggruppamento, che i dati della riga non "stano uniti" - all'interno del gruppo di un particolare DIM_KEY, MAX(DAIRY_CLM) può provenire da qualsiasi riga, MAX(KOSHER_CLM) può provenire da qualsiasi altra riga.. In pratica questo significa che i singoli valori vengono prelevati, i nulli vengono scartati, compaiono tutti sulla stessa riga..
..e quindi i tuoi dati verticali sono diventati orizzontali, dopo aver attraversato la diagonale