SSMS
 sql >> Base de données >  >> Database Tools >> SSMS

Transposer des groupes de lignes avec le même ID dans une autre table

Il s'agit bien d'un pivot, aussi appelé tableau croisé, ou parfois transpose

Certaines bases de données ont des installations dédiées pour le faire, d'autres vous devez utiliser une syntaxe de regroupement. Je préfère ce dernier car il fonctionne universellement

Si ça peut te consoler, tu étais vraiment proche !

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

Comment ça marche ?

Eh bien, si vous exécutez la version non groupée et sans fonctions maximales que vous aviez déjà :

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

Ensuite, vous verrez vos données devenir "diagonales" :

3005, 123423, null, null...
3005, null,   N,    null...
3005, null,   null, Y   ...

Dans chaque colonne (par dim_key) il n'y a qu'une seule valeur, les autres sont NULL

L'ajout de GROUP BY et MAX les fait se réduire en une seule ligne car MAX() renverra uniquement la valeur de la colonne et fera disparaître tous les nulls. C'est une propriété intrinsèque d'un regroupement, que les données de ligne ne "restent pas ensemble" - dans le groupe d'un DIM_KEY particulier, le MAX(DAIRY_CLM) peut provenir de n'importe quelle ligne, le MAX(KOSHER_CLM) peut provenir de n'importe quelle autre ligne. En pratique, cela signifie que les valeurs uniques sont sélectionnées, les valeurs nulles sont supprimées, elles apparaissent toutes sur la même ligne..

..et ainsi vos données verticales sont devenues horizontales, après être passées par la diagonale