sql >> Database teknologi >  >> RDS >> Database

Forstå PIVOT-, UNPIVOT- og Reverse PIVOT-udsagn

PIVOT-sætningen bruges til at konvertere tabelrækker til kolonner, mens UNPIVOT-operatoren konverterer kolonner tilbage til rækker. Tilbageførsel af en PIVOT-sætning refererer til processen med at anvende UNPIVOT-operatoren på det allerede PIVOTED-datasæt for at hente det originale datasæt.

I denne artikel vil vi studere disse tre begreber på forskellige eksempler.

PIVOT-operatør

Som tidligere nævnt konverterer PIVOT-operatoren tabelrækker til kolonner. For eksempel, hvis du har en tabel, der ser sådan ud:

og drej den ved den tredje kolonne, vil resultatet være som følger:

I den oprindelige tabel havde vi to unikke værdier for kolonnerne Kursus – Engelsk og Historie. I den pivoterede tabel er disse unikke værdier blevet konverteret til kolonner. Du kan se, at scoreværdierne for hver ny kolonne forbliver uændrede. I den originale tabel havde en elev, Sally, f.eks. scoret 95 på engelsk, i modsætning til værdierne i den pivoterede tabel.

Sørg som altid for, at du laver en sikker sikkerhedskopi, før du foretager justeringer af en live database.

Lad os se på dette eksempel på brug af PIVOT-operatøren i 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)

Scriptet ovenfor opretter skolens database. I databasen opretter vi elevtabellen med fire kolonner, såsom Id, StudentName, Course og Score. Til sidst tilføjer vi de fire dummy-poster til tabellen Elever.

Nu, hvis du bruger en SELECT-sætning til at hente alle posterne, vil du se følgende:

Lad os PIVOT denne tabel efter kolonnen Kursus. For at gøre dette skal du udføre følgende script:

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

Lad os se, hvad der sker i manuskriptet. I den første linje bruger vi SELECT-sætningen til at definere de kolonner, som vi vil tilføje til den pivoterede tabel. De første to kolonner er StudentName og Score. Dataene for disse to kolonner kommer direkte fra tabellen Elever. Den tredje kolonne er Kursus. Vi ønsker at PIVOTere vores tabel efter kolonnen Kursus, derfor vil kolonnen Kursus blive opdelt i antallet af kolonner svarende til værdierne angivet af PIVOT-operatoren for kolonnen Kursus.

Syntaksen for PIVOT-operatoren er enkel. Først skal du anvende en aggregeret funktion til kolonnen, hvis værdier du vil have vist i de pivoterede kolonner. I vores tilfælde ønsker vi at vise Score i de drejelige kolonner – Engelsk og Historie. Til sidst bruger vi en FOR-sætning til at specificere pivotkolonnen og de unikke værdier i den. Resultatet ser således ud:

UNPIVOT-operatør

UNPIVOT-operatoren bruges til at konvertere tabelkolonner til rækker. For eksempel, hvis du har en tabel, der ser sådan ud:

UNPIVOT-operatøren returnerer følgende resultater:

Kolonnerne i den oprindelige tabel er blevet konverteret til rækkerne i den ikke-pivoterede tabel. Lad os bruge disse data til at se, hvordan UNPIVOT-operatøren fungerer i SQL.

For at gøre dette skal du udføre følgende script:

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)

Hvis du vælger data fra tabellen Elever i School2-databasen, vil du se følgende resultater:

For at anvende UNPIVOT-operatoren på denne tabel skal du køre følgende forespørgsel:

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

Syntaksen for UNPIVOT-operatoren ligner PIVOT-en. I SELECT-sætningen skal du angive de kolonner, du vil tilføje til outputtabellen. I UNPIVOT-sætningen vil du angive to kolonner:

  1. Den første kolonne indeholder værdierne fra rækkerne i de pivoterede kolonner (som er Score i dette tilfælde).
  2. Den anden kolonne indeholder navnene på de drejelige kolonner, dvs. matematik, engelsk, historie og naturvidenskab.

Outputtabellen vil se sådan ud:

Vend en PIVOT

Reversering af en PIVOT-operator henviser til processen med at anvende UNPIVOT-operatoren på en pivotabel tabel for at vende tilbage til den oprindelige tabel.

Reverserende ikke-aggregeret pivotabel tabel

Det er kun muligt at vende en PIVOT-operator, hvis den pivoterede tabel ikke indeholder aggregerede data.

Lad os se på tabellen, vi brugte i PIVOT-afsnittet i denne artikel.

Du kan se, at der ikke er gentagne rækker. Vi kan med andre ord sige, at der for hver elev kun er én rekord pr. kursus. For eksempel har Sally kun én rekord for sin score i engelskkurset.

Da vi anvendte PIVOT-operatoren på ovenstående tabel, fik vi følgende resultat:

Nu skal vi anvende UNPIVOT-operatoren på dette resultat og se, om vi kan vende tilbage til den oprindelige tabel. For at gøre dette skal du udføre følgende script:

Bemærk:

Vi kan udføre denne forespørgsel på Skoledatabasen, som vi oprettede i PIVOT-operatorafsnittet.

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

Her bruger vi en underforespørgsel til at anvende UNPIVOT-operatoren på de pivoterede data. Den indre forespørgsel bruger PIVOT-operatoren, mens den ydre forespørgsel bruger UNPIVOT-operatoren. Ved udgangen vil du se den originale elevtabel.

Reverserende aggregeret pivotabel tabel

Vi sagde tidligere, at det kun er muligt at reversere en PIVOT-operatør, der ikke indeholder aggregerede data. Lad os prøve at vende PIVOT-sætningen, der indeholder aggregerede data.

Føj endnu en post til tabellen Elever i Skoledatabasen, som vi oprettede i det første afsnit af denne artikel. For at gøre dette skal du køre følgende forespørgsel:

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

Hvis du nu vælger alle posterne fra tabellen Elever, får du følgende output:

Vi kan se, at vi har en dublet rekord for Edwards score i historie.

Anvend nu PIVOT-operatoren på denne tabel.

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

Fra outputtet kan du se, at SUM-funktionen i PIVOT-operatoren har tilføjet to scoringer til Historiekurset taget af Edward. Hvis du forsøger at vende denne tabels pivot (dvs. anvende UNPIVOT-operatoren), vil du ikke modtage den oprindelige tabel. Det vil returnere de fire plader i stedet for de originale fem. Kolonnen Historie for eleven Edward vil indeholde det aggregerede resultat i stedet for de individuelle resultater.

For at se dette skal du udføre følgende script:

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

Outputtabellen vil se sådan ud:

Referencer:

  • Microsoft:Brug af PIVOT og UNPIVOT
  • Codingsight:Brug af PIVOT i SQL
  • YouTube:Omvendt PIVOT-video

  1. Hvad er en 'multi-part identifier', og hvorfor kan den ikke bindes?

  2. Tilslut Java til en MySQL-database

  3. MariaDB JSON_UNQUOTE() Forklaret

  4. SQL Server 2008 tusinde separator for en kolonne