PIVOT ve UNPIVOT kullanma

Başka bir tablodaki tablo değerli ifadeyi değiştirmek için PIVOT ve UNPIVOT ilişkisel işleçleri kullanabilirsiniz.PIVOT, tablo değerli ifadeyi ifadedeki bir sütunda bulunan benzersiz değerleri çıkıştaki çoklu sütunlara dönüştürerek döndürür ve son çıkışta istenen kalan sütun değerlerinde gerek duyuldukları toplamaları gerçekleştirir.UNPIVOT, sütun değerleri içindeki tablo değerli ifadenin sütunlarını döndürerek PIVOT'un ters işlemini gerçekleştirir.

Not

PIVOT ve UNPIVOT SQL Server 2005 sürümüne veya daha üzeri bir sürüme yükseltilen veritabanlarına karşı kullanılır. Veritabanının uyumluluk düzeyi 90 veya üzeri bir değere ayarlanmalıdır.Veritabanı uyumluluk düzeyini nasıl ayarlayacağınız hakkında bilgi edinmek için sp_dbcmptlevel (Transact-sql) bölümüne göz atın.

PIVOT tarafından sağlanan sözdizimi karmaşık SELECT...CASE deyimi dizilerinde başka türlü ifade edilebilecek sözdiziminden daha basit ve okuması kolaydır.PIVOT sözdiziminin eksiksiz bir açıklaması için bkz: (Transact-sql).

Aşağıdakiler PIVOT için eklenmiş sözdizimidir.

SELECT <non-pivoted column>,

    [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 will become column headers>]

    IN ( [first pivoted column], [second pivoted column],

... [last pivoted column])

) AS <alias for the pivot table>

<optional ORDER BY clause>;

Temel PIVOT Örneği

Aşağıdaki kod örneği, dört satıra sahip iki sütunlu bir tablo oluşturur.

USE AdventureWorks2008R2 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product
GROUP BY DaysToManufacture;

Sonuç kümesi buradadır.

DaysToManufacture          AverageCost

0                          5.0885

1                          223.88

2                          359.1082

4                          949.4105

Hiçbir ürün üç DaysToManufacture ile tanımlanmaz.

Aşağıdaki kod, DaysToManufacture değerlerinin sütun başlıkları haline gelebilmesi için aynı sonucu görüntüler.Sonuçlar NULL olsa bile, bir sütun üç [3] gün boyunca kullanıma sunulur.

-- Pivot table with one row and five columns
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[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 buradadır.

Cost_Sorted_By_Production_Days    0         1         2           3       4       

AverageCost                       5.0885    223.88    359.1082    NULL    949.4105

Karmaşık PIVOT Örneği

PIVOT öğesinin kullanışlı olabileceği ortak bir senaryo verileri özetlemek için çapraz sekme raporları oluşturmak istediğiniz zamandır.Örneğin, belirli çalışanlar tarafından yerleştirilmiş satınalma siparişi sayısını belirtmek için AdventureWorks2008R2 örnek veritabanındaki PurchaseOrderHeader tablosunu sorgulamak istediğinizi varsayalım.Aşağıdaki sorgu, satıcı tarafından sipariş edilen bu raporu sağlar.

USE AdventureWorks2008R2;
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 sonuç kümesi:

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 EmployeeID sütununda özetlenir.

SELECT PurchaseOrderID, EmployeeID, VendorID
FROM PurchaseOrderHeader;

Bu, EmployeeID sütunu tarafından döndürülen benzersiz değerlerin son sonuç kümesindeki alanlar haline geldiği anlamına gelir.Bu nedenle özet cümlede belirtilen her bir EmployeeID numarası için bir sütun bulunur: Bu örnekte çalışanlar 164, 198, 223, 231 ve 233.PurchaseOrderID sütunu son çıkışta gruplanan ve gruplandırma sütunları adı verilen sütunların karşılık olarak döndürüldüğü değer sütunu görevini üstlenir.Bu örnekte, gruplama sütunları COUNT işlevi ile toplanır.Her bir çalışan için COUNT değeri hesaplanırken, PurchaseOrderID sütununda görünen null değerlerin dikkate alınmayacağını gösteren uyarı iletisinin görüneceğini aklınızda bulundurun.

Önemli notÖnemli

Toplama işlevleri PIVOT ile kullanıldığında, değer sütununda bulunan null değerler toplam değer hesaplanırken dikkat alınmaz.

UNPIVOT, sütunları satırlara döndürerek hemen hemen PIVOT'un tersi işlem yapar.Önceki örnekte oluşturulan tablonun veritabanında pvt olarak depolandığını ve sütun tanımlayıcılarını, Emp1, Emp2, Emp3, Emp4 ve Emp5 öğelerini belirli satıcılara karşılık gelen satır değerlerine döndürmek istediğinizi varsayalım.Bu, iki ek sütun tanımlamanız gerektiği anlamına gelir.Döndürdüğünüz sütun değerlerini içerecek sütun (Emp1, Emp2,...) Employee olarak adlandırılır ve şu anda döndürülmekte olan sütunlarda yer alan değerleri içerecek sütun ise Orders olarak adlandırılır.Bu sütunlar Transact-SQL tanımında sırasıyla pivot_column ve value_column öğelerine karşılık gelir.Sorgu:

--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 sonuç kümesi:

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'un PIVOT'un tam tersi olmadığını aklınızda bulundurun.PIVOT, toplama gerçekleştirir ve bu nedenle olası birden fazla satırı çıkıştaki bir satırda birleştirir.UNPIVOT, satırlar birleştirilmiş olduğundan özgün tablo değerli ifade sonucunu yeniden oluşturmaz.Bunun yanı sıra PIVOT işleminden önce girişte özgün null değerler olabileceğinden UNPIVOT'un girişindeki null değerler çıkışta görünür.

AdventureWorks2008R2 örnek veritabanındaki Sales.vSalesPersonSalesByFiscalYears görünümü her bir satış temsilcisine ve mali yıla ilişkin toplam satışı döndürmek için PIVOT kullanır.SQL Server Management Studio ve Object Explorer içindeki görünümüne ilişkin komut dosyası oluşturmak için AdventureWorks2008R2 veritabanına ilişkin Görünümler klasörünün altındaki görünümü bulun.Görünüm adını sağ tıklatın ve ardından Komut Dosyasını Farklı Görüntüle'yi seçin.

Ayrıca bkz.

Başvuru