Erläuterung der Pivot-Abfrage
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Dies sind die Spalten, die zu den „Basisdaten“ für den Pivot werden. Schließen Sie keine Spalten ein, die nichts bewirken. So wie Sie keine Nicht-GROUP BY-Spalten in die SELECT-Klausel einfügen, listen Sie nicht ungenutzte Spalten in einer PIVOT-Quelle auf.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Dieser Teil besagt, dass Sie 5 neue Spalten mit den Namen "Val1" bis "Val5" erstellen. Diese Spaltennamen repräsentieren Werte in der Spalte Val. Es wird also erwartet, dass Ihre Tabelle so etwas enthält
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)
Sie haben also jetzt 5 neue Spalten, die vorher nicht existierten. Was kommt in die Spalte?
- Jede Spalte, die in der AUSGABE erscheint und keine PIVOT-Spalte ist, ist eine "GROUP BY"-Spalte.
- Die Aggregatfunktion sammelt alle Daten in der Zelle, die das CROSS zwischen den GROUP BY-Spalten und der PIVOTED-Spalte ist.
Zur Veranschaulichung haben wir unter Verwendung der obigen Beispieldaten otherID=1 und val=Val1. In der Ausgabetabelle gibt es nur eine Zelle, die diese Kombination von Max(amount) für jede (otherID/val)-Kombination repräsentiert
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Für die mit <x>
markierte Zelle , ist nur ein Wert zulässig, also <x>
kann nicht mehrere amount
enthalten Werte. Aus diesem Grund müssen wir es aggregieren, in diesem Fall mit MAX(amount)
. Tatsächlich sieht die Ausgabe so aus
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
Die SELECT-Anweisung gibt dann diese Spalten aus
SELECT OtherID, Val1, Val2, Val3, Val4, Val5