FRA – Brug af PIVOT og UNPIVOT
- 14/10/2019
- 5 minutter til at læse
-
- V
- c
- M
- i
- M
-
+7
Gælder for: SQL Server (alle understøttede versioner) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallelt datalager
Du kan bruge relationerne PIVOT
og UNPIVOT
til ændre et tabelværdiansat udtryk til en anden tabel. PIVOT
roterer et tabelværdiansat udtryk ved at omdanne de unikke værdier fra en kolonne i udtrykket til flere kolonner i output. Og PIVOT
kører aggregeringer, hvor de “kræves på eventuelle resterende kolonneværdier, der ønskes i den endelige output. UNPIVOT
udfører den modsatte operation til PIVOT ved at rotere søjler i et tabelværdisk udtryk til søjleværdier.
Syntaksen for PIVOT
giver er enklere og mere læselig end den syntaks, der ellers kan være specificeret i en kompleks serie af SELECT...CASE
udsagn. For en komplet beskrivelse af syntaksen for PIVOT
, se FROM (Transact-SQL).
Syntaks
Følgende syntaks opsummerer, hvordan man bruger PIVOT
operatøren.
Bemærkninger
Kolonneidentifikatorerne i UNPIVOT
-sætningen følger katalogsammensætningen. For SQL Database er sorteringen altid SQL_Latin1_General_CP1_CI_AS
. For SQL Server er delvist indeholdt databaser er sorteringen altid Latin1_General_100_CI_AS_KS_WS_SC
. Hvis kolonnen er kombineret redigeres med andre kolonner, så kræves der en sorteringsklausul (COLLATE DATABASE_DEFAULT
) for at undgå konflikter.
Grundlæggende PIVOT-eksempel
Følgende kodeeksempel producerer en to-søjletabel, der har fire rækker.
Her er resultatsættet.
Ingen produkter er defineret med tre DaysToManufacture
.
Følgende kode viser det samme resultat, drejet så DaysToManufacture
værdier bliver kolonneoverskrifterne. Der findes en kolonne i tre dage, selvom resultaterne er
NULL
.
Her er resultatsættet .
Kompleks PIVOT Eksempel
Et almindeligt scenario, hvor PIVOT
kan være nyttigt når du vil generere krydstabuleringsrapporter for at give et resumé af dataene. Antag for eksempel, at du vil forespørge PurchaseOrderHeader
-tabellen i AdventureWorks2014
eksempeldatabasen for at bestemme antallet af indkøbsordrer, der er afgivet af visse medarbejdere. Følgende forespørgsel indeholder denne rapport, bestilt af leverandør.
Her er et delresultatsæt.
Resultaterne, der returneres af denne undervalg sætning drejes i EmployeeID
kolonnen.
De unikke værdier, der returneres af EmployeeID
kolonne bliver felter i det endelige resultatsæt. Som sådan er der “en kolonne for hver EmployeeID
nummer angivet i pivotklausulen: i dette tilfælde ansatte 250
, 251
, 256
, 257
og 260
. div id = “c36dcf6b3b”>
-kolonnen tjener som værdikolonnen, mod hvilken kolonnerne, der returneres i den endelige output, der kaldes grupperingskolonnerne, er grupperet. I dette tilfælde aggregeres grupperingskolonnerne af COUNT
-funktion. Bemærk, at der vises en advarselsmeddelelse, der angiver, at eventuelle nulværdier, der vises i PurchaseOrderID
-kolonnen, ikke blev taget i betragtning ved beregning af COUNT
for hver medarbejder.
Vigtigt
Når samlede funktioner bruges med PIVOT
tilstedeværelsen af nulværdier i værdikolonnen tages ikke i betragtning ved beregning af en sammenlægning.
UNPIVOT Eksempel
UNPIVOT
udfører næsten den omvendte operation af PIVOT
ved at rotere kolonner i rækker. Antag, at tabellen, der blev produceret i det foregående eksempel, er gemt i databasen som pvt
, og du vil rotere kolonneidentifikatorerne Emp1
, Emp2
, Emp3
, Emp4
og Emp5
i rækkeværdier, der svarer til en bestemt leverandør. Som sådan skal du identificere to ekstra kolonner.Kolonnen, der indeholder kolonneværdierne, som du roterer (Emp1
, Emp2
, …) kaldes Employee
, og den kolonne, der indeholder de værdier, der aktuelt findes under kolonnerne, der roteres, kaldes Orders
. Disse kolonner svarer til pivot_column og value_column henholdsvis i Transact-SQL-definitionen. Her er forespørgslen.
Her er et delvis resultatsæt.
Bemærk, at UNPIVOT
er ikke det nøjagtige omvendte af PIVOT
. PIVOT
udfører en sammenlægning og fletter mulige flere rækker i en enkelt række i output. UNPIVOT
reproducerer ikke det oprindelige tabelværdiansatte ekspressionsresultat, fordi rækker er blevet flettet. Også nulværdier i input af UNPIVOT
forsvinder i output. Når værdierne forsvinder, viser det, at der muligvis har været originale nulværdier i inputet før PIVOT
-operationen.
Sales.vSalesPersonSalesByFiscalYears
-visning i AdventureWorks2012-eksempeldatabasen bruger PIVOT
til at returnere det samlede salg for hver sælger for hvert regnskabsår. At scripte visningen i SQL Server Management Studio , i Objekt Explorer, find visningen under mappen Visninger til AdventureWorks2012-databasen. Højreklik på visningsnavnet, og vælg derefter Scriptvisning som.
Se også
FROM (Transact -SQL)
CASE (Transact-SQL)