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