Förklaring av pivotfrågan
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Det här är kolumnerna som blir "basdata" för pivoten. Inkludera inte kolumner som inte gör någonting. Precis som du inte lägger in icke-GROUP BY-kolumner i SELECT-satsen, listar du inte outnyttjade kolumner i en PIVOT-källa.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Den här delen säger att du skapar 5 nya kolumner med namnet "Val1" till "Val5". Dessa kolumnnamn representerar värden i kolumnen Val. Så det förväntas att din tabell kommer att innehålla något liknande
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 nya kolumner som inte fanns tidigare. Vad går in i kolumnen?
- Alla kolumner som visas i OUTPUT som inte är en PIVOTerad kolumn är en "GROUP BY"-kolumn.
- Aggregeringsfunktionen är det som samlar in all data i cellen som är KORSET mellan GROUP BY-kolumnerna och PIVOTED-kolumnen.
Så för att illustrera, med hjälp av exempeldata ovan, har vi otherID=1 och val=Val1. I utdatatabellen finns det bara en cell som representerar denna kombination av Max(amount) för varje (otherID/val)-kombination
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
För cellen märkt <x>
, endast ett värde tillåts, så <x>
kan inte innehålla flera amount
värden. Det är anledningen till att vi måste aggregera det, i det här fallet med MAX(amount)
. Så i själva verket ser resultatet ut så här
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
SELECT-satsen är det som sedan matar ut dessa kolumner
SELECT OtherID, Val1, Val2, Val3, Val4, Val5