Cuma , 17 Ağustos 2018

T-SQL Pivot Komutu Kullanımı

Group by komutunu kullanarak verilerilerimizi satır bazında gruplayabiliyoruz. Fakat bazı durumlarda bu satır bilgilerinin sütuna dönüştürmesi istenmektedir. İşte bu gibi durumlarda sorgu sonucumuzda dönen kayıt setinin satırlarını sütuna çevirme tekniğine pivot tablo denmektedir.

Özellikle raporlama kısmında çok fazla kullanılan pivot tablolar verilerin en özet halini sunmaktadır. Örneğin siparişler tablosundaki verilerimizi yıllara göre gruplayıp toplam ne kadar satış yaptığımız özetleyecek olursak her yıl için bir yıl bilgisi birde toplam satış bilgisini içeren bir satır verimiz oluşacaktır. İşte bu satırlarda bulunan yıl değerlerini süton olarak kullanıp ilgili sütunun altına o yıl yapılan satışların toplamını listelemek çok fazlakarşılaşılan ihtiyaçtır. Şimdi örneğe geçmeden önce konunun anlaşılması için yukarıdaki siparişler örneğini şematize edelim.

Son üç yıllık satış adetlerinin group by operatörü ile özetlenmiş hali yandaki gibidir. Fakat gelende raporlama için bu tablonun aşağıdakigibi tek satır veri olmasını tekrar etmeyen yıl değerlerinin de sutun olması istenir.

 Yukarıdaki verinin pivot işleminden sonra pivot tabloya dönüştürülmesi verilerin okunabilirliğini artırmıştır.

Bu işlemi T-SQL ile yaparken öncelikle pivot tabloda kullanılacak kolonların adlarını belirlemeliyiz. Daha sonra pivot işlemi ile kullanılacak gruplama fonksiyonuna da karar verdikten sonra işlem yapmaya başlayabiliriz. Şimdi Adventureworks veritabanı üzerinde bulunan ve kişilerin adres bilgilerini tutan tabloda eyalet olarak Arizona,California,Texas seçmiş olan personelin adetlerini bulalım. Bunun için önce veriyi gruplayalım.

SELECT sp.StateProvinceCode,COUNT(sp.StateProvinceCode) Adet
FROM Person.Address a
INNER JOIN Person.StateProvince sp
ON a.StateProvinceID = sp.StateProvinceID
where sp.StateProvinceCode in('AZ','CA','TX')
group by sp.StateProvinceCode

Sorgumuzun sonucu aşağıdaki gibidir.

 

 Şimdi sorgumuzu pivot tabloya çevirelim. Bunun için yukarıda yazdığımız sorgudan öncelikle gruplama ifadelerini çıkarıp sorgumuz bir subquery haline getiriyoruz.

select * from (

 SELECT sp.StateProvinceCode
 FROM Person.Address a
 INNER JOIN Person.StateProvince sp
 
 ON a.StateProvinceID = sp.StateProvinceID

 ) k

Sonki adım olarak PIVOT ahantar sözcüğü ile yukarıdaki sorgudan dönen sonucu pivot tabloya dönüştürmek istediğimizi belirtiyoruz. Pivot ifadesi ile birlikte kullancağımız gruplama fonksiyonunu ve bunun sonucunda oluşacak olan kolon isimlerini belirtiyoruz.

 PIVOT
(
 
 COUNT(StateProvinceCode)
 
 FOR StateProvinceCode IN([AZ],[CA],[TX])
 
 ) AS pvt

Yukarıdaki sorguda da belirttiğimzi gibi kolon isimleri [] içinde belirtilmeli ve aralarına virgül konulmalıdır. Şimdi iki sorguyu birleştirip çalıştıralım ve sonuca bakalım.

SELECT * FROM (
 SELECT sp.StateProvinceCode
 FROM Person.Address a
 INNER JOIN Person.StateProvince sp
 ON a.StateProvinceID = sp.StateProvinceID
 ) k
 PIVOT (
 COUNT(StateProvinceCode)
 FOR StateProvinceCode IN([AZ],[CA],[TX])
) AS pvt;

Sorgunun çıktısında da görüldüğü gibi pivot işlemini uyguladıktan sonra sorgumuzun satırlarını sütun şeklinde ifade etmiş olduk.

Pivot tablo ile dikkat edilmesi gereken bir diğer nokta ise normal sorgumuzda kullandığımız koşul ifadesini(where sp.StateProvinceCode in(‘AZ’,’CA’,’TX’)) pivot tabloya dönüştürüken kullanmadık. Çünkü kolon isimlerini belirtmiş olmamın veriler gruplanırken bir koşul teşkil etmesidir.  Fakat koşul kullansak bile aynı sonucu elde ederdik

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>