Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Veuillez expliquer les parties d'un PIVOT

Explication de la requête pivot

FROM 
    (SELECT OtherID, Val, amount
    FROM @randomTable) p

Ce sont les colonnes qui deviennent les "données de base" du pivot. N'incluez pas les colonnes qui ne font rien. Tout comme vous ne mettez pas de colonnes non-GROUP BY dans la clause SELECT, vous ne répertoriez pas les colonnes inutilisées dans une source PIVOT.

PIVOT
(
    max(amount)
    FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;

Cette partie indique que vous créez 5 nouvelles colonnes nommées "Val1" à "Val5". Ces noms de colonnes représentent des valeurs dans la colonne Val. On s'attend donc à ce que votre table contienne quelque chose comme ça

otherID   Val     amount
1         Val1    1
2         Val2    2
1         Val3    3
1         Val1    5
(etc)     (this column contains one of Val1 - Val5, or null)

Vous avez donc maintenant 5 nouvelles colonnes qui n'existaient pas auparavant. Qu'est-ce qui se passe dans la colonne ?

  • Toute colonne qui apparaît dans OUTPUT qui n'est pas une colonne PIVOT est une colonne "GROUP BY".
  • La fonction d'agrégation est ce qui collecte toutes les données dans la cellule qui est la CROIX entre les colonnes GROUP BY et la colonne PIVOTED.

Donc, pour illustrer, en utilisant les exemples de données ci-dessus, nous avons otherID=1 et val=Val1. Dans le tableau de sortie, il n'y a qu'une seule cellule représentant cette combinaison de Max(amount) pour chaque combinaison (otherID/val)

otherID   Val1   Val2   Val3   Val4   Val5
1         <x>    ...    ...    ...    ...
(etc)

Pour la cellule marquée <x> , une seule valeur est autorisée, donc <x> ne peut pas contenir plusieurs amount valeurs. C'est la raison pour laquelle nous devons l'agréger, dans ce cas en utilisant MAX(amount) . Donc, en fait, la sortie ressemble à ceci

(unpivoted columns)   (pivoted, creates "new" columns)
otherID             |  Val1          Val2           Val3   Val4   Val5
1                   |  MAX(amount)   Max(amount)    << cell value = aggregate function
(etc)

L'instruction SELECT est ce qui génère ensuite ces colonnes

SELECT OtherID, Val1, Val2, Val3, Val4, Val5