FRÅN – Använd PIVOT och UNPIVOT
- 14/10/2019
- 5 minuter att läsa
-
- V
- c
- M
- i
- M
-
+7
Gäller för: SQL Server (alla versioner som stöds) Azure SQL-databas Azure SQL-hanterad instans Azure Synapse Analytics Parallellt datalager
Du kan använda relationerna PIVOT
och UNPIVOT
till ändra ett tabellvärderat uttryck till en annan tabell. PIVOT
roterar ett tabellvärderat uttryck genom att förvandla de unika värdena från en kolumn i uttrycket till flera kolumner i utdata. Och PIVOT
kör aggregeringar där de krävs för alla återstående kolumnvärden som önskas i den slutliga utgången. UNPIVOT
utför motsatt operation till PIVOT genom att rotera kolumner i ett tabellvärderat uttryck till kolumnvärden.
Syntaxen för PIVOT
ger är enklare och mer läsbar än den syntax som annars kan vara specificerad i en komplex serie av SELECT...CASE
uttalanden. För en fullständig beskrivning av syntaxen för PIVOT
, se FROM (Transact-SQL).
Syntax
Följande syntax sammanfattar hur man använder PIVOT
operatören.
Anmärkningar
Kolumnidentifierarna i UNPIVOT
-satsen följer katalogsorteringen. För SQL-databas är sorteringen alltid SQL_Latin1_General_CP1_CI_AS
. För SQL Server ingår delvis databaser är sorteringen alltid Latin1_General_100_CI_AS_KS_WS_SC
. Om kolumnen är kombinerad redigeras med andra kolumner, sedan krävs en sorteringssats (COLLATE DATABASE_DEFAULT
) för att undvika konflikter.
Grundläggande PIVOT-exempel
Följande kodexempel ger en tabell med två kolumner som har fyra rader.
Här är resultatuppsättningen.
Inga produkter definieras med tre DaysToManufacture
.
Följande kod visar samma resultat, svängt så att DaysToManufacture
värden blir kolumnrubrikerna. En kolumn tillhandahålls under tre dagar, även om resultaten är
NULL
.
Här är resultatuppsättningen .
Komplex PIVOT-exempel
Ett vanligt scenario där PIVOT
kan vara användbart när du vill generera kors-tabellrapporter för att ge en sammanfattning av data. Antag till exempel att du vill fråga PurchaseOrderHeader
tabellen i AdventureWorks2014
exempeldatabasen för att bestämma antalet inköpsorder som vissa anställda gör. Följande fråga ger denna rapport, beställd av leverantör.
Här är en deluppsättning.
Resultaten som returneras av detta underval uttalande svängs i kolumnen EmployeeID
.
De unika värdena som returneras av EmployeeID
kolumn blir fält i den slutliga resultatuppsättningen. Som sådan finns det en sa kolumn för varje EmployeeID
nummer som anges i pivotklausulen: i detta fall anställda 250
, 251
, 256
, 257
och 260
. div id = ”c36dcf6b3b”>
-kolumnen fungerar som värdekolumnen, mot vilken kolumnerna som returneras i den slutliga utgången, som kallas grupperingskolumnerna, grupperas. I detta fall aggregeras grupperingskolumnerna av COUNT
-funktion. Observera att ett varningsmeddelande visas som indikerar att alla nollvärden som visas i PurchaseOrderID
-kolumnen inte beaktades vid beräkning av COUNT
för varje anställd.
Viktigt
När aggregerade funktioner används med PIVOT
närvaron av nollvärden i värdekolumnen beaktas inte vid beräkning av en aggregering.
UNPIVOT Exempel
UNPIVOT
utför nästan den omvända operationen av PIVOT
genom att rotera kolumner i rader. Anta att tabellen i föregående exempel lagras i databasen som pvt
, och du vill rotera kolumnidentifierarna Emp1
, Emp2
, Emp3
, Emp4
och Emp5
i radvärden som motsvarar en viss leverantör. Som sådan måste du identifiera ytterligare två kolumner.Kolumnen som innehåller kolumnvärdena som du roterar (Emp1
, Emp2
, …) kommer att kallas Employee
, och kolumnen som innehåller de värden som för närvarande finns under kolumnerna som roteras kommer att kallas Orders
. Dessa kolumner motsvarar pivot_column och value_column respektive i Transact-SQL-definitionen. Här är frågan.
Här är en delresultatsats.
Observera att UNPIVOT
är inte det exakta omvändet av PIVOT
. PIVOT
genomför en aggregering och slår samman möjliga flera rader till en enda rad i utdata. UNPIVOT
reproducerar inte det ursprungliga tabellvärderade uttrycksresultatet eftersom rader har sammanfogats. Nollvärden i ingången till UNPIVOT
försvinner också. i utgången. När värdena försvinner visar det att det kan ha funnits ursprungliga nollvärden i ingången före PIVOT
-operationen.
Sales.vSalesPersonSalesByFiscalYears
-vy i AdventureWorks2012-exempeldatabasen använder PIVOT
för att returnera den totala försäljningen för varje säljare för varje räkenskapsår. För att skripta vyn i SQL Server Management Studio , i Object Explorer, leta reda på vyn under mappen Views för AdventureWorks2012-databasen. Högerklicka på visningsnamnet och välj sedan Script View som.
Se även
FROM (Transact -SQL)
CASE (Transact-SQL)