sql >> Database >  >> RDS >> Database

PIVOT-, UNPIVOT- en Reverse PIVOT-statements begrijpen

De PIVOT-instructie wordt gebruikt om tabelrijen om te zetten in kolommen, terwijl de UNPIVOT-operator kolommen weer omzet in rijen. Het omkeren van een PIVOT-instructie verwijst naar het proces waarbij de UNPIVOT-operator wordt toegepast op de reeds PIVOTED-dataset om de originele dataset op te halen.

In dit artikel zullen we deze drie concepten bestuderen aan de hand van verschillende voorbeelden.

PIVOT-operator

Zoals eerder vermeld, converteert de PIVOT-operator tabelrijen naar kolommen. Als u bijvoorbeeld een tabel heeft die er als volgt uitziet:

en draai het door de derde kolom, het resultaat is als volgt:

In de oorspronkelijke tabel hadden we twee unieke waarden voor de Cursuskolommen:Engels en Geschiedenis. In de draaitabel zijn deze unieke waarden omgezet in kolommen. U kunt zien dat de scorewaarden voor elke nieuwe kolom ongewijzigd blijven. In de oorspronkelijke tabel had een student, Sally, bijvoorbeeld 95 gescoord in het Engels, in tegenstelling tot de waarden in de draaitabel.

Zorg er zoals altijd voor dat u een veilige back-up maakt voordat u wijzigingen aanbrengt in een live database.

Laten we eens kijken naar dit voorbeeld van het gebruik van de PIVOT-operator in SQL Server.

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)

Het bovenstaande script maakt de School-database aan. In de database maken we de tabel Studenten met vier kolommen, zoals Id, StudentName, Course en Score. Ten slotte voegen we de vier dummy-records toe aan de tabel Studenten.

Als u nu een SELECT-instructie gebruikt om alle records op te halen, ziet u het volgende:

Laten we deze tabel PIVOTEREN aan de hand van de kolom Cursus. Voer hiervoor het volgende script uit:

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

Laten we eens kijken wat er in het script gebeurt. In de eerste regel gebruiken we de SELECT-instructie om de kolommen te definiëren die we aan de draaitabel willen toevoegen. De eerste twee kolommen zijn StudentName en Score. De gegevens voor deze twee kolommen komen rechtstreeks uit de tabel Studenten. De derde kolom is Cursus. We willen onze tabel DRAAIEN op basis van de kolom Cursus, daarom wordt de kolom Cursus opgesplitst in het aantal kolommen dat gelijk is aan de waarden die zijn opgegeven door de PIVOT-operator voor de kolom Cursus.

De syntaxis voor de PIVOT-operator is eenvoudig. Eerst moet u een aggregatiefunctie toepassen op de kolom waarvan u de waarden in de gedraaide kolommen wilt weergeven. In ons geval willen we Score weergeven in de gedraaide kolommen - Engels en Geschiedenis. Ten slotte gebruiken we een FOR-instructie om de spilkolom en de unieke waarden erin op te geven. Het resultaat ziet er als volgt uit:

UNPIVOT-operator

De UNPIVOT-operator wordt gebruikt om tabelkolommen om te zetten in rijen. Als u bijvoorbeeld een tabel heeft die er als volgt uitziet:

De UNPIVOT-operator geeft de volgende resultaten:

De kolommen van de oorspronkelijke tabel zijn geconverteerd naar de rijen in de niet-gedraaide tabel. Laten we die gegevens gebruiken om te zien hoe de UNPIVOT-operator in SQL werkt.

Voer hiervoor het volgende script uit:

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)

Als u de gegevens selecteert uit de tabel Studenten van de School2-database, ziet u de volgende resultaten:

Voer de volgende query uit om de UNPIVOT-operator op deze tabel toe te passen:

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

De syntaxis voor de UNPIVOT-operator is vergelijkbaar met de PIVOT-operator. In de SELECT-instructie moet u de kolommen specificeren die u aan de uitvoertabel wilt toevoegen. In de UNPIVOT-verklaring specificeert u twee kolommen:

  1. De eerste kolom bevat de waarden uit de rijen van de gedraaide kolommen (in dit geval Score).
  2. De tweede kolom bevat de namen van de gedraaide kolommen, d.w.z. Wiskunde, Engels, Geschiedenis en Wetenschap.

De uitvoertabel ziet er als volgt uit:

Een PIVOT omkeren

Het omkeren van een PIVOT-operator verwijst naar het proces waarbij de UNPIVOT-operator wordt toegepast op een draaitabel om terug te gaan naar de oorspronkelijke tabel.

Niet-geaggregeerde draaitabel omkeren

Het omkeren van een PIVOT-operator is alleen mogelijk als de draaitabel geen geaggregeerde gegevens bevat.

Laten we eens kijken naar de tabel die we in het PIVOT-gedeelte van dit artikel hebben gebruikt.

U kunt zien dat er geen herhaalde rijen zijn. Met andere woorden, we kunnen zeggen dat er voor elke student slechts één record per cursus is. Sally heeft bijvoorbeeld maar één record voor haar score in de cursus Engels.

Toen we de PIVOT-operator op de bovenstaande tabel toepasten, kregen we het volgende resultaat:

Nu gaan we de UNPIVOT-operator toepassen op dit resultaat en kijken of we terug kunnen naar de oorspronkelijke tabel. Voer hiervoor het volgende script uit:

Opmerking:

We kunnen deze query uitvoeren op de School-database die we hebben gemaakt in de PIVOT-operatorsectie.

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 gebruiken we een subquery om de UNPIVOT-operator toe te passen op de gedraaide gegevens. De inner query gebruikt de PIVOT-operator, terwijl de buitenste query de UNPIVOT-operator gebruikt. Aan de uitgang zie je de originele studententabel.

Geaggregeerde draaitabel omkeren

We zeiden eerder dat het alleen mogelijk is om een ​​PIVOT-operator om te draaien die geen geaggregeerde gegevens bevat. Laten we proberen de PIVOT-instructie die geaggregeerde gegevens bevat om te draaien.

Voeg nog een record toe aan de tabel Studenten van de schooldatabase die we in de eerste sectie van dit artikel hebben gemaakt. Voer hiervoor de volgende query uit:

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

Als u nu alle records uit de tabel Studenten selecteert, krijgt u de volgende uitvoer:

We kunnen zien dat we een duplicaat record hebben voor Edwards score in Geschiedenis.

Pas nu de PIVOT-operator toe op deze tabel.

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

Aan de output kun je zien dat de SOM-functie in de PIVOT-operator twee scores heeft toegevoegd aan de cursus Geschiedenis die Edward heeft gevolgd. Als u de spil van deze tabel probeert om te keren (d.w.z. de UNPIVOT-operator toepast), ontvangt u niet de originele tabel. Het zal de vier records retourneren in plaats van de oorspronkelijke vijf. De kolom Geschiedenis voor de leerling Edward zal het geaggregeerde resultaat bevatten in plaats van de individuele resultaten.

Voer het volgende script uit om dit te zien:

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

De uitvoertabel ziet er als volgt uit:

Referenties:

  • Microsoft:PIVOT en UNPIVOT gebruiken
  • Codingsight:PIVOT gebruiken in SQL
  • YouTube:PIVOT-video omkeren

  1. Hoe MariaDB in te stellen om verticale uitvoer te gebruiken

  2. Wanneer moet ik puntkomma's gebruiken in SQL Server?

  3. Een getal opmaken als een percentage in MySQL

  4. Primaire sleutelbeperking aan identiteitskolommen toevoegen aan alle tabellen in SQL Server-database - SQL Server / TSQL-zelfstudie, deel 63