Forklaring af pivotforespørgslen
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Det er de kolonner, der bliver "basisdata" for pivoten. Medtag ikke kolonner, der ikke gør noget. Ligesom du ikke indsætter ikke-GROUP BY-kolonner i SELECT-sætningen, oplister du ikke ubrugte kolonner i en PIVOT-kilde.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Denne del siger, at du opretter 5 nye kolonner med navnet "Val1" til "Val5". Disse kolonnenavne repræsenterer værdier i kolonnen Val. Så det forventes, at din tabel vil indeholde noget som dette
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)
Så du har nu 5 nye kolonner, der ikke eksisterede før. Hvad går der ind i kolonnen?
- Enhver kolonne, der vises i OUTPUT, som ikke er en PIVOTeret kolonne, er en "GROUP BY"-kolonne.
- Aggregeringsfunktionen er det, der indsamler alle data i cellen, der er KRYDSET mellem GROUP BY-kolonnerne og PIVOTED-kolonnen.
Så for at illustrere, ved hjælp af eksempeldataene ovenfor, har vi otherID=1 og val=Val1. I outputtabellen er der kun én celle, der repræsenterer denne kombination af Max(amount) for hver (otherID/val) kombination
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
For cellen markeret <x>
, kun én værdi er tilladt, så <x>
kan ikke indeholde flere amount
værdier. Det er grunden til, at vi er nødt til at aggregere det, i dette tilfælde ved hjælp af MAX(amount)
. Så faktisk ser outputtet sådan her ud
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
SELECT-sætningen er det, der så udsender disse kolonner
SELECT OtherID, Val1, Val2, Val3, Val4, Val5