Uitleg van de pivot-query
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Dit zijn de kolommen die de "basisgegevens" voor de spil worden. Neem geen kolommen op die niets doen. Net zoals u geen niet-GROUP BY-kolommen in de SELECT-component plaatst, vermeldt u geen ongebruikte kolommen in een PIVOT-bron.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Dit deel zegt dat u 5 nieuwe kolommen maakt met de naam "Val1" tot en met "Val5". Deze kolomnamen vertegenwoordigen waarden in de kolom Val. Er wordt dus verwacht dat uw tabel zoiets als dit zal bevatten
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)
Je hebt nu dus 5 nieuwe kolommen die voorheen niet bestonden. Wat komt er in de kolom?
- Elke kolom die in de OUTPUT verschijnt en die geen gedraaide kolom is, is een kolom 'GROUP BY'.
- De aggregatiefunctie verzamelt alle gegevens in de cel die het CROSS vormt tussen de GROUP BY-kolommen en de PIVOTED-kolom.
Dus, om te illustreren, met behulp van de voorbeeldgegevens hierboven, hebben we otherID=1 en val=Val1. In de uitvoertabel is er slechts één cel die deze combinatie van Max(bedrag) voor elke (otherID/val) combinatie vertegenwoordigt
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Voor de cel gemarkeerd met <x>
, er is slechts één waarde toegestaan, dus <x>
mag niet meerdere amount
bevatten waarden. Dat is de reden waarom we het moeten aggregeren, in dit geval met MAX(amount)
. Dus in feite ziet de uitvoer er zo uit
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
De SELECT-instructie is wat deze kolommen vervolgens uitvoert
SELECT OtherID, Val1, Val2, Val3, Val4, Val5