Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
tablo değerli bir ifadeyi PIVOT başka bir tabloya dönüştürmek için ve UNPIVOT ilişkisel işleçlerini kullanabilirsiniz.
PIVOT , ifadedeki bir sütundaki benzersiz değerleri çıktıda birden çok sütuna dönüştürerek tablo değerli bir ifadeyi döndürür.
PIVOT ayrıca, son çıktıda istenen kalan sütun değerlerinde gerekli oldukları toplamaları çalıştırır.
UNPIVOT , tablo değerli bir ifadenin sütunlarını sütun değerlerine döndürerek için ters işlemi PIVOTyürütür.
için söz dizimi PIVOT , karmaşık bir deyim serisinde aksi takdirde belirtilebilen söz diziminden SELECT...CASE daha kolay ve daha okunabilir. için söz diziminin tam açıklaması için PIVOTbkz . FROM yan tümcesi.
Note
Tek bir T-SQL deyimi içinde PIVOT/UNPIVOT yinelenen kullanımı sorgu performansını olumsuz etkileyebilir.
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
Syntax
Bu bölümde ve PIVOT işlecinin UNPIVOT nasıl kullanılacağı özetlemektedir.
İşlecin PIVOT söz dizimi.
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> ]
[ ; ]
İşlecin UNPIVOT söz dizimi.
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
UNPIVOT yan tümcesindeki sütun tanımlayıcıları katalog harmanlamasını izler.
Azure SQL Veritabanı için harmanlama her zaman
SQL_Latin1_General_CP1_CI_ASşeklindedir.SQL Server kısmen kapsanan veritabanları için harmanlama her zaman
Latin1_General_100_CI_AS_KS_WS_SC.
Sütun diğer sütunlarla birleştirilirse çakışmaları önlemek için bir harmanlama yan tümcesi (COLLATE DATABASE_DEFAULT) gerekir.
Microsoft Fabric ve Azure Synapse Analytics havuzlarında işleci olan PIVOT sorgular, tarafından GROUP BYgönderilen bir nonpivot sütun çıkışında varsa PIVOT başarısız olur. Geçici bir çözüm olarak, içinden nonpivot sütununu GROUP BYkaldırın. Bu GROUP BY yan tümce yinelenen olduğundan sorgu sonuçları aynıdır.
Temel PIVOT örneği
Aşağıdaki kod örneği, dört satırı olan iki sütunlu bir tablo oluşturur.
USE AdventureWorks2022;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost
FROM Production.Product
GROUP BY DaysToManufacture;
Sonuç kümesi aşağıdadır.
DaysToManufacture AverageCost
------------------ ------------
0 5.0885
1 223.88
2 359.1082
4 949.4105
için 3değerine sahip hiçbir ürün tanımlanmamıştırDaysToManufacture.
Aşağıdaki kod, değerlerin sütun başlıkları haline gelmesi için DaysToManufacture özetlenmiş olarak aynı sonucu görüntüler. Sonuçlar [3]olsa da üç (NULL) gün boyunca bir sütun sağlanır.
-- 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;
Sonuç kümesi aşağıdadır.
CostSortedByProductionDays 0 1 2 3 4
--------------------------- ----------- ----------- ----------- ----------- -----------
AverageCost 5.0885 223.88 359.1082 NULL 949.4105
Karmaşık PIVOT örneği
Yararlı olabilecek yaygın senaryolardan PIVOT biri, verilerin özetini vermek için çapraz tablolama raporları oluşturmak istemenizdir. Örneğin, belirli çalışanlar tarafından verilen satın alma siparişlerinin sayısını belirlemek için örnek veritabanındaki PurchaseOrderHeader tabloyu sorgulamak AdventureWorks2025 istediğinizi varsayalım. Aşağıdaki sorgu, satıcıya göre sipariş edilen bu raporu sağlar.
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;
Kısmi bir sonuç kümesi aşağıdadır.
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
Bu alt seçim deyimi tarafından döndürülen sonuçlar sütunda EmployeeID özetlenir.
SELECT PurchaseOrderID,
EmployeeID,
VendorID
FROM PurchaseOrderHeader;
Sütun tarafından EmployeeID döndürülen benzersiz değerler, son sonuç kümesinde alan haline gelir. Bu nedenle, pivot yan tümcesinde belirtilen her EmployeeID sayı için çalışanlar , 250, 251, 256ve 257 bu örnekteki 260bir sütun vardır. Sütun PurchaseOrderID , gruplandırma sütunları olarak adlandırılan son çıktıda döndürülen sütunların gruplandırıldığı değer sütunu görevi görür. Bu durumda, gruplandırma sütunları işlev tarafından COUNT toplanır. Her çalışanın hesaplaması PurchaseOrderID sırasında sütunda görünen null değerlerin COUNT dikkate alınmadığını belirten bir uyarı iletisi görüntülenir.
Important
ile PIVOTtoplama işlevleri kullanıldığında, bir toplama işlemi sırasında değer sütunundaki null değerlerin varlığı dikkate alınmaz.
UNPIVOT örneği
UNPIVOT , sütunlarını satırlara döndürerek neredeyse ters işlemini PIVOTyürütür. Önceki örnekte üretilen tablonun veritabanında olarak pvtdepolandığını ve , Emp1, Emp2, Emp3ve Emp4 sütun tanımlayıcılarını Emp5belirli bir satıcıya karşılık gelen satır değerlerine döndürmek istediğinizi varsayalım. Bu nedenle, fazladan iki sütun tanımlamanız gerekir.
Döndürdüğünüz sütun değerlerini (Emp1, Emp2vb.) içeren sütun olarak adlandırılır Employeeve döndürülmekte olan sütunların altında bulunan değerleri barındıran sütun olarak adlandırılır Orders. Bu sütunlar,Transact-SQL tanımında sırasıyla pivot_column ve value_column karşılık gelir. Sorgu şu şekildedir.
-- 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
Kısmi bir sonuç kümesi aşağıdadır.
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 tam tersi PIVOTdeğildir.
PIVOT bir toplama gerçekleştirir ve olası birden çok satırı çıktıda tek bir satırda birleştirir.
UNPIVOT satırlar birleştirildiği için özgün tablo değerli ifade sonucunu yeniden oluşturmaz. Ayrıca girişindeki NULLUNPIVOT değerler çıkışta kaybolur. Değerler kaybolduğunda, girişte işlemden önce NULL özgün PIVOT değerler olabileceğini gösterir.
Sales.vSalesPersonSalesByFiscalYears Örnek veritabanındaki AdventureWorks2025 görünüm, her mali yıl için her satış temsilcisinin toplam satışını döndürmek için kullanırPIVOT. GÖRÜNÜMÜ SQL Server Management Studio'da betik oluşturmak için Nesne Gezgini'nde, veritabanının Görünümler klasörünün AdventureWorks2025 altındaki görünümü bulun. Görünüm adına sağ tıklayın ve ardından Betik Görünümü'nü farklı seçin.