SSMS
 sql >> Database >  >> Database Tools >> SSMS

Trasposizione di gruppi di righe con lo stesso ID in un'altra tabella

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