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

PIVOT-, UNPIVOT- und Reverse-PIVOT-Anweisungen verstehen

Die PIVOT-Anweisung wird verwendet, um Tabellenzeilen in Spalten umzuwandeln, während der UNPIVOT-Operator Spalten wieder in Zeilen umwandelt. Das Umkehren einer PIVOT-Anweisung bezieht sich auf den Prozess der Anwendung des UNPIVOT-Operators auf den bereits PIVOTED-Datensatz, um den ursprünglichen Datensatz abzurufen.

In diesem Artikel werden wir diese drei Konzepte an verschiedenen Beispielen untersuchen.

PIVOT-Operator

Wie bereits erwähnt, konvertiert der PIVOT-Operator Tabellenzeilen in Spalten. Wenn Sie beispielsweise eine Tabelle haben, die so aussieht:

und sie um die dritte Spalte drehen, sieht das Ergebnis wie folgt aus:

In der ursprünglichen Tabelle hatten wir zwei eindeutige Werte für die Kursspalten – Englisch und Geschichte. In der Pivot-Tabelle wurden diese eindeutigen Werte in Spalten umgewandelt. Sie können sehen, dass die Score-Werte für jede neue Spalte unverändert bleiben. Beispielsweise hatte eine Schülerin, Sally, in der ursprünglichen Tabelle 95 Punkte in Englisch erzielt, im Gegensatz zu den Werten in der Pivot-Tabelle.

Stellen Sie wie immer sicher, dass Sie ein sicheres Backup erstellen, bevor Sie Anpassungen an einer Live-Datenbank vornehmen.

Sehen wir uns dieses Beispiel für die Verwendung des PIVOT-Operators in SQL Server an.

CREATE DATABASE School
GO

USE School
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Course VARCHAR (50),
	Score INT
)
GO

INSERT INTO Students VALUES ('Sally', 'English', 95 )
INSERT INTO Students VALUES ('Sally', 'History', 82)
INSERT INTO Students VALUES ('Edward', 'English', 45)
INSERT INTO Students VALUES ('Edward', 'History', 78)

Das obige Skript erstellt die School-Datenbank. In der Datenbank erstellen wir die Tabelle „Students“ mit vier Spalten, z. B. „ID“, „StudentName“, „Course“ und „Score“. Schließlich fügen wir die vier Dummy-Datensätze zur Tabelle Students hinzu.

Wenn Sie nun eine SELECT-Anweisung verwenden, um alle Datensätze abzurufen, sehen Sie Folgendes:

Drehen wir diese Tabelle nach der Spalte Kurs. Führen Sie dazu das folgende Skript aus:

SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot

Mal sehen, was im Skript passiert. In der ersten Zeile verwenden wir die SELECT-Anweisung, um die Spalten zu definieren, die wir der Pivot-Tabelle hinzufügen möchten. Die ersten beiden Spalten sind StudentName und Score. Die Daten für diese beiden Spalten stammen direkt aus der Tabelle „Studenten“. Die dritte Spalte ist Kurs. Wir möchten unsere Tabelle nach der Kursspalte PIVOTEN, daher wird die Kursspalte in die Anzahl von Spalten aufgeteilt, die gleich den Werten ist, die vom PIVOT-Operator für die Kursspalte angegeben wurden.

Die Syntax für den PIVOT-Operator ist einfach. Zuerst müssen Sie eine Aggregatfunktion auf die Spalte anwenden, deren Werte Sie in den schwenkbaren Spalten anzeigen möchten. In unserem Fall möchten wir die Punktzahl in den schwenkbaren Spalten – Englisch und Geschichte – anzeigen. Schließlich verwenden wir eine FOR-Anweisung, um die Pivot-Spalte und die darin enthaltenen eindeutigen Werte anzugeben. Das Ergebnis sieht so aus:

UNPIVOT-Operator

Der UNPIVOT-Operator wird verwendet, um Tabellenspalten in Zeilen umzuwandeln. Wenn Sie beispielsweise eine Tabelle haben, die so aussieht:

Der UNPIVOT-Operator gibt die folgenden Ergebnisse zurück:

Die Spalten der Originaltabelle wurden in die Zeilen der nichtpivotierten Tabelle konvertiert. Lassen Sie uns diese Daten verwenden, um zu sehen, wie der UNPIVOT-Operator in SQL funktioniert.

Führen Sie dazu das folgende Skript aus:

CREATE DATABASE School2
GO

USE School2
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Math INT,
	English INT,
	History INT,
	Science INT
)
GO

INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 )
INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)

Wenn Sie die Daten aus der Schülertabelle der School2-Datenbank auswählen, sehen Sie die folgenden Ergebnisse:

Um den UNPIVOT-Operator auf diese Tabelle anzuwenden, führen Sie die folgende Abfrage aus:

SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
	Score
	FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

Die Syntax für den UNPIVOT-Operator ähnelt der PIVOT-Operator. In der SELECT-Anweisung müssen Sie die Spalten angeben, die Sie der Ausgabetabelle hinzufügen möchten. In der UNPIVOT-Anweisung geben Sie zwei Spalten an:

  1. Die erste Spalte enthält die Werte aus den Zeilen der Pivot-Spalten (in diesem Fall die Punktzahl).
  2. Die zweite Spalte enthält die Namen der Pivot-Spalten, d. h. Mathematik, Englisch, Geschichte und Naturwissenschaften.

Die Ausgabetabelle sieht folgendermaßen aus:

Einen PIVOT umkehren

Das Umkehren eines PIVOT-Operators bezieht sich auf den Prozess der Anwendung des UNPIVOT-Operators auf eine Pivot-Tabelle, um zur ursprünglichen Tabelle zurückzukehren.

Umkehren einer nicht aggregierten Pivot-Tabelle

Das Umkehren eines PIVOT-Operators ist nur möglich, wenn die Pivot-Tabelle keine aggregierten Daten enthält.

Schauen wir uns die Tabelle an, die wir im PIVOT-Abschnitt dieses Artikels verwendet haben.

Sie können sehen, dass es keine wiederholten Zeilen gibt. Mit anderen Worten, wir können sagen, dass es für jeden Studenten nur einen Datensatz pro Kurs gibt. Zum Beispiel hat Sally nur einen Rekord für ihre Punktzahl im Englischkurs.

Als wir den PIVOT-Operator auf die obige Tabelle angewendet haben, haben wir das folgende Ergebnis erhalten:

Jetzt werden wir den UNPIVOT-Operator auf dieses Ergebnis anwenden und sehen, ob wir zur ursprünglichen Tabelle zurückkehren können. Führen Sie dazu das folgende Skript aus:

Hinweis:

Wir können diese Abfrage auf der Schuldatenbank ausführen, die wir im PIVOT-Operatorabschnitt erstellt haben.

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Hier verwenden wir eine Unterabfrage, um den UNPIVOT-Operator auf die pivotierten Daten anzuwenden. Die innere Abfrage verwendet den PIVOT-Operator, während die äußere Abfrage den UNPIVOT-Operator verwendet. Als Ausgabe sehen Sie die ursprüngliche Students-Tabelle.

Umkehren der aggregierten Pivot-Tabelle

Wir haben bereits gesagt, dass es nur möglich ist, einen PIVOT-Operator umzukehren, der keine aggregierten Daten enthält. Versuchen wir, die PIVOT-Anweisung umzukehren, die aggregierte Daten enthält.

Fügen Sie einen weiteren Datensatz zur Tabelle „Students“ der School-Datenbank hinzu, die wir im ersten Abschnitt dieses Artikels erstellt haben. Führen Sie dazu die folgende Abfrage aus:

INSERT INTO Students VALUES ('Edward', 'History', 78)

Wenn Sie nun alle Datensätze aus der Tabelle „Studenten“ auswählen, erhalten Sie die folgende Ausgabe:

Wir können sehen, dass wir einen doppelten Datensatz für Edwards Punktzahl im Verlauf haben.

Wenden Sie nun den PIVOT-Operator auf diese Tabelle an.

SELECT Id, StudentName, English, History
FROM Students
PIVOT
(
	SUM (Score)
	FOR Course in (English, History)
) AS Schoolpivot

Aus der Ausgabe können Sie ersehen, dass die SUM-Funktion im PIVOT-Operator dem von Edward absolvierten Geschichtskurs zwei Punkte hinzugefügt hat. Wenn Sie versuchen, den Pivot dieser Tabelle umzukehren (d. h. den UNPIVOT-Operator anzuwenden), erhalten Sie nicht die ursprüngliche Tabelle. Es werden die vier Datensätze anstelle der ursprünglichen fünf zurückgegeben. Die Spalte Verlauf für den Schüler Edward enthält das aggregierte Ergebnis und nicht die Einzelergebnisse.

Führen Sie dazu das folgende Skript aus:

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Die Ausgabetabelle sieht folgendermaßen aus:

Referenzen:

  • Microsoft:Verwenden von PIVOT und UNPIVOT
  • Codingsight:PIVOT in SQL verwenden
  • YouTube:Reverse-PIVOT-Video