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:
- Den første kolonne indeholder værdierne fra rækkerne i de pivoterede kolonner (som er Score i dette tilfælde).
- 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