Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Förhandsversion av Microsoft Fabric
Du kan använda relationsoperatorerna PIVOT och UNPIVOT för att ändra ett tabellvärdeuttryck till en annan tabell.
PIVOT roterar ett tabellvärdesuttryck genom att omvandla de unika värdena från en kolumn i uttrycket till flera kolumner i utdata.
PIVOT kör också aggregeringar där de krävs för eventuella återstående kolumnvärden som önskas i de slutliga utdata.
UNPIVOT utför den motsatta åtgärden till genom att PIVOTrotera kolumner i ett tabellvärdeuttryck i kolumnvärden.
Syntaxen för PIVOT är enklare och mer läsbar än den syntax som annars kan anges i en komplex serie med SELECT...CASE instruktioner. En fullständig beskrivning av syntaxen för PIVOTfinns i FROM-satsen.
Note
Upprepad användning av PIVOT/UNPIVOT i en enda T-SQL-instruktion kan påverka frågeprestanda negativt.
Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
Syntax
I det här avsnittet sammanfattas hur du använder operatorn PIVOT och UNPIVOT .
Syntax för operatorn PIVOT .
SELECT [ <non-pivoted column> [ AS <column name> ] , ]
...
[ <first pivoted column> [ AS <column name> ] ,
[ <second pivoted column> [ AS <column name> ] , ]
...
[ <last pivoted column> [ AS <column name> ] ] ]
FROM
( <SELECT query that produces the data> )
AS <alias for the source query>
PIVOT
(
<aggregation function> ( <column being aggregated> )
FOR <column that contains the values that become column headers>
IN ( <first pivoted column>
, <second pivoted column>
, ... <last pivoted column> )
) AS <alias for the pivot table>
[ <optional ORDER BY clause> ]
[ ; ]
Syntax för operatorn UNPIVOT .
SELECT [ <non-pivoted column> [ AS <column name> ] , ]
...
[ <output column for names of the pivot columns> [ AS <column name> ] , ]
[ <new output column created for values in result of the source query> [ AS <column name> ] ]
FROM
( <SELECT query that produces the data> )
AS <alias for the source query>
UNPIVOT
(
<new output column created for values in result of the source query>
FOR <output column for names of the pivot columns>
IN ( <first pivoted column>
, <second pivoted column>
, ... <last pivoted column> )
)
[ <optional ORDER BY clause> ]
[ ; ]
Remarks
Kolumnidentifierarna i UNPIVOT-satsen följer katalogsortering.
För Azure SQL Database är sorteringen alltid
SQL_Latin1_General_CP1_CI_AS.För SQL Server-delvis inneslutna databaser är sorteringen alltid
Latin1_General_100_CI_AS_KS_WS_SC.
Om kolumnen kombineras med andra kolumner krävs en sorteringssats (COLLATE DATABASE_DEFAULT) för att undvika konflikter.
I Microsoft Fabric- och Azure Synapse Analytics-pooler misslyckas frågor med PIVOT operatorn om det finns en GROUP BY på icke-pivotkolumnens utdata från PIVOT. Som en lösning tar du bort kolumnen nonpivot från GROUP BY. Frågeresultaten är desamma eftersom den här GROUP BY satsen är en dubblett.
Grundläggande PIVOT-exempel
I följande kodexempel skapas en tabell med två kolumner som har fyra rader.
USE AdventureWorks2022;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost
FROM Production.Product
GROUP BY DaysToManufacture;
Här är resultatet.
DaysToManufacture AverageCost
------------------ ------------
0 5.0885
1 223.88
2 359.1082
4 949.4105
Inga produkter definieras med värdet 3 för för DaysToManufacture.
Följande kod visar samma resultat, pivoterat så att DaysToManufacture värdena blir kolumnrubrikerna. En kolumn tillhandahålls i tre ([3]) dagar, även om resultatet är NULL.
-- Pivot table with one row and five columns
SELECT 'AverageCost' AS CostSortedByProductionDays,
[0], [1], [2], [3], [4]
FROM (
SELECT DaysToManufacture,
StandardCost
FROM Production.Product
) AS SourceTable
PIVOT (
AVG(StandardCost) FOR DaysToManufacture IN
([0], [1], [2], [3], [4])
) AS PivotTable;
Här är resultatet.
CostSortedByProductionDays 0 1 2 3 4
--------------------------- ----------- ----------- ----------- ----------- -----------
AverageCost 5.0885 223.88 359.1082 NULL 949.4105
Komplext PIVOT-exempel
Ett vanligt scenario där PIVOT kan vara användbart är när du vill generera kors tabulationsrapporter för att ge en sammanfattning av data. Anta till exempel att du vill fråga PurchaseOrderHeader tabellen i exempeldatabasen AdventureWorks2022 för att fastställa antalet inköpsorder som görs av vissa anställda. Följande fråga innehåller den här rapporten, sorterad efter leverantör.
USE AdventureWorks2022;
GO
SELECT VendorID,
[250] AS Emp1,
[251] AS Emp2,
[256] AS Emp3,
[257] AS Emp4,
[260] AS Emp5
FROM
(
SELECT PurchaseOrderID,
EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader
) p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN ([250], [251], [256], [257], [260])
) AS pvt
ORDER BY pvt.VendorID;
Här är en partiell resultatuppsättning.
VendorID Emp1 Emp2 Emp3 Emp4 Emp5
----------- ----------- ----------- ----------- ----------- -----------
1492 2 5 4 4 4
1494 2 5 4 5 4
1496 2 4 4 5 5
1498 2 5 4 4 4
1500 3 4 4 5 4
Resultaten som returneras av den här undermarkeringsinstrukturen pivoteras i EmployeeID kolumnen.
SELECT PurchaseOrderID,
EmployeeID,
VendorID
FROM PurchaseOrderHeader;
De unika värden som returneras av EmployeeID kolumnen blir fält i den slutliga resultatuppsättningen. Därför finns det en kolumn för varje EmployeeID nummer som anges i pivotsatsen, som är anställda 250, 251, 256, 257och 260 i det här exemplet. Kolumnen PurchaseOrderID fungerar som värdekolumnen, mot vilken kolumnerna som returneras i de slutliga utdata, som kallas grupperingskolumner, grupperas. I det här fallet aggregeras grupperingskolumnerna av COUNT funktionen. Ett varningsmeddelande visas som anger att alla nullvärden som visas i PurchaseOrderID kolumnen inte beaktades vid beräkning av COUNT för varje anställd.
Important
När aggregerade funktioner används med PIVOTbeaktas inte förekomsten av null-värden i värdekolumnen vid beräkning av en aggregering.
UNPIVOT example
UNPIVOT utför nästan den omvända åtgärden av PIVOT, genom att rotera kolumner i rader. Anta att tabellen som skapades i föregående exempel lagras i databasen som pvt, och du vill rotera kolumnidentifierarna Emp1, , Emp2Emp3, Emp4och Emp5 till radvärden som motsvarar en viss leverantör. Därför måste du identifiera två extra kolumner.
Kolumnen som innehåller de kolumnvärden som du roterar (Emp1, Emp2och så vidare) kallas Employee, och kolumnen som innehåller de värden som för närvarande finns under de kolumner som roteras, kallas Orders. Dessa kolumner motsvarar pivot_column respektive value_column i definitionen för Transact-SQL. Här är frågan.
-- Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (
VendorID INT,
Emp1 INT,
Emp2 INT,
Emp3 INT,
Emp4 INT,
Emp5 INT);
GO
INSERT INTO pvt
VALUES (1, 4, 3, 5, 4, 4);
INSERT INTO pvt
VALUES (2, 4, 1, 5, 5, 5);
INSERT INTO pvt
VALUES (3, 4, 3, 5, 4, 4);
INSERT INTO pvt
VALUES (4, 4, 2, 5, 5, 4);
INSERT INTO pvt
VALUES (5, 5, 1, 5, 5, 5);
GO
-- Unpivot the table.
SELECT VendorID, Employee, Orders
FROM (
SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt
) p
UNPIVOT
(
Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5)
) AS unpvt;
GO
Här är en partiell resultatuppsättning.
VendorID Employee Orders
----------- ----------- ------
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5
UNPIVOT är inte den exakta motsatsen till PIVOT.
PIVOT utför en aggregering och sammanfogar möjliga flera rader till en enda rad i utdata.
UNPIVOT återskapar inte det ursprungliga tabellvärdeuttrycksresultatet eftersom rader har sammanfogats. Dessutom NULL försvinner värden i indata UNPIVOT för utdata. När värdena försvinner visar det att det kan ha funnits ursprungliga NULL värden i indata före åtgärden PIVOT .
Vyn Sales.vSalesPersonSalesByFiscalYears i exempeldatabasen AdventureWorks2022 använder PIVOT för att returnera den totala försäljningen för varje säljare för varje räkenskapsår. Om du vill skripta vyn i SQL Server Management Studio letar du upp vyn under mappen Vyer för AdventureWorks2022 databasen i Object Explorer. Högerklicka på vynamnet och välj sedan Skriptvy som.