Database
 sql >> Datenbank >  >> RDS >> Database

Grundlegendes zum Pivot-Operator in SQL

Der Pivot-Operator in SQL Server konvertiert jede Zeile in der aggregierten Ergebnismenge in entsprechende Spalten in der Ausgabemenge. Der Pivot-Operator ist besonders nützlich beim Schreiben von Kreuztabellenabfragen.

Schauen wir uns an, wie es in der Praxis funktioniert.

Vorbereitung der Daten

Lassen Sie uns zunächst einige Dummy-Daten erstellen, die wir dann verwenden können, um den Pivot-Operator zu implementieren.

CREATE DATABASE schooldb
					
CREATE TABLE student
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    DOB datetime NOT NULL,
    total_score INT NOT NULL,
    city VARCHAR(50) NOT NULL
 )

INSERT INTO student

VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500, 'London'), 
(2, 'Jon', 'Male', '02-FEB-1974', 545, 'Manchester'), 
(3, 'Sara', 'Female', '07-MAR-1988', 600, 'Leeds'), 
(4, 'Laura', 'Female', '22-DEC-1981', 400, 'Liverpool'), 
(5, 'Alan', 'Male', '29-JUL-1993', 500, 'London'), 
(6, 'Kate', 'Female', '03-JAN-1985', 500, 'Liverpool'), 
(7, 'Joseph', 'Male', '09-APR-1982', 643, 'London'), 
(8, 'Mice', 'Male', '16-AUG-1974', 543, 'Liverpool'), 
(9, 'Wise', 'Male', '11-NOV-1987', 499, 'Manchester'), 
(10, 'Elis', 'Female', '28-OCT-1990', 400, 'Leeds');

Wie funktioniert der Pivot-Operator?

Die Standardmethode zum Gruppieren von SQL-Daten ist die Verwendung der Group By-Klausel. Lassen Sie uns eine Abfrage erstellen, die den Durchschnitt der Werte in der Spalte „total_score“ der Tabelle „student“ berechnet, gruppiert nach Stadt.

USE schooldb

SELECT 
	city,
	AVG(total_score) as Avg_Score
FROM 
	student
GROUP BY
	city

Dies ergibt das folgende Ergebnis:

[Tabellen-ID=25 /]

Was ist, wenn wir eine Ergebnismenge wünschen, in der die Städtenamen in Spalten angezeigt werden, wobei jede Spalte den Durchschnittswert des total_score der Studenten enthält, die zu dieser Stadt gehören? Etwa so:

[Tabellen-ID=26 /]

Hier kommt der Pivot-Operator ins Spiel.

Auswahl der Stammdaten

Der erste Schritt bei der Verwendung des Pivot-Operators besteht darin, die Basisdaten auszuwählen, auf denen der Pivot-Operator basieren soll. Wir möchten unsere Daten nach Stadt gruppieren und den Durchschnitt der total_score der Studenten finden, die zu dieser Stadt gehören. Daher müssen wir eine einfache SELECT-Anweisung schreiben, die die Stadt und die Gesamtpunktzahl auswählt.

SELECT 
	city,
	total_score
FROM 
	student

Erstellen eines temporären Datensatzes

Jetzt könnten wir den Pivot-Operator idealerweise direkt auf die Basisdaten anwenden, die wir im vorherigen Abschnitt erstellt haben, aber leider können wir das nicht. Damit der Pivot-Operator funktioniert, müssen wir einen Tabellenwertausdruck erstellen, auf den wir den Pivot-Operator anwenden können. Wir haben hier eine Vielzahl von Möglichkeiten; wir könnten abgeleitete Tabellen, allgemeine Tabellenausdrücke (CTEs) verwenden oder sogar temporäre Tabellen erstellen.

Für dieses Beispiel verwenden wir eine schnelle, einfache abgeleitete Tabelle. Um dies mit der grundlegenden select-Anweisung zu tun, die wir im letzten Abschnitt erstellt haben, schließen wir sie in eine Reihe von Klammern ein und wenden dann einen Alias ​​darauf an. Schließlich wählen wir alles aus dieser abgeleiteten Tabelle aus.

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable

Anwenden des Pivot-Operators

Nachdem wir unsere Basisdaten vorbereitet und eine abgeleitete Tabelle erstellt haben, wenden wir den Pivot-Operator darauf an.

Fügen Sie dazu „PIVOT“ am Ende der abgeleiteten Tabelle ein, gefolgt von einer Reihe von Klammern, und geben Sie dieser Pivot-Tabelle einen Alias.

Innerhalb der Klammern müssen wir einige wichtige Informationen angeben.

  1. Wir müssen das Feld angeben, auf das wir eine Aggregatfunktion anwenden möchten. In unserem Fall möchten wir die AVG-Aggregatfunktion in der Spalte „total_score“ anwenden.
  2. Wir müssen dann sagen, auf welche Spalten der Basisdaten wir unsere Daten schwenken. Dazu schreiben wir „FOR“, gefolgt vom Spaltennamen, der in unserem Beispiel eine Stadt ist.
  3. Der letzte Schritt ist etwas irritierend. Wir müssen die Werte aus der Stadtspalte auflisten, die wir als Überschriften in unserer Pivot-Tabelle verwenden möchten. Wir verwenden den IN-Operator, gefolgt von einer Reihe von Klammern. Innerhalb der Klammern verwenden wir eine durch Kommas getrennte Liste, in der wir den Namen jeder Spalte in eine eckige Klammer schreiben. In unserem Beispiel wollen wir London, Leeds und Manchester als Überschriftennamen der Pivot-Tabelle und schreiben sie daher in diesem Format:([London], [Leeds], [Manchester]).
USE schooldb

SELECT * FROM

(SELECT 
	city,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

Wenn Sie die obige Abfrage ausführen, sehen die Ergebnisse so aus:

[Tabellen-ID=27 /]

Hinzufügen von Zeilengruppen in der Pivot-Tabelle

In den vorherigen Abschnitten haben wir gesehen, wie man Zeilengruppen mit dem Pivot-Operator in Spaltengruppen umwandelt. Sie können jedoch auch Zeilengruppen zusammen mit Spaltengruppen zu einer Pivot-Tabelle hinzufügen.

Wenn Sie beispielsweise den Durchschnittswert der Spalte „total_score“ aller Schüler finden möchten, die sowohl nach Stadt als auch nach Geschlecht gruppiert sind, können Sie die Spaltengruppe und die Zeilengruppe zusammen in einer Pivot-Tabelle verwenden. Hier steht jede Spalte für einen Stadtnamen und jede Zeile für ein Schülergeschlecht.

Glücklicherweise müssen Sie kein zusätzliches Skript schreiben, um einer Pivot-Tabelle Zeilengruppen hinzuzufügen. Fügen Sie innerhalb des Basisdatensatzes einfach den Spaltennamen hinzu, den Sie als Zeilengruppe zur Pivot-Tabelle hinzufügen möchten.

USE schooldb

SELECT * FROM

(SELECT 
	city,
	gender,
	total_score
FROM 
	student
)
AS StudentTable
PIVOT(
	AVG(total_score)
	FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable

Im obigen Skript haben wir einfach die Spalte „Geschlecht“ in der Basis-SELECT-Anweisung hinzugefügt.

Die Ausgabe der obigen Abfrage sieht folgendermaßen aus:

[Tabellen-ID=28 /]

Dies ist eine Kreuztabelle. Aus den Ergebnissen geht beispielsweise hervor, dass die durchschnittliche Gesamtpunktzahl der in London lebenden Studentinnen 500 beträgt. Ebenso beträgt die durchschnittliche Gesamtpunktzahl der in London lebenden männlichen Studenten 571.

Lesen Sie auch:

Erstellen einer dynamischen Pivot-Tabelle mit der QUOTENAME-Funktion