Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bitte erläutern Sie die Bestandteile eines PIVOT

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