Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

SQL Server’da Pivot Table Kullanımı

Merhaba,

Bu içeriğimizde; SQL’de sorgu sonucu elde ettiğimiz tablo verilerini görsel açıdan daha anlamlı ve okunabilir bir şekilde düzenleyen harika bir fonksiyon olan Pivot Table’ın kullanımına değineceğiz.

Pivot Table, sorgu sonucu gelen tablo üzerindeki verileri belirli bir satırdaki veriler merkezinde kolonlara ayırarak yatay olarak şekillendiren ve verisel karşılık olarakta bu kolonlaştırılan satırlara denk gelen değerleri basan bir raporlama fonksiyonudur. Bu şekilde yığın verilerden anlamlı özet tablolar çıkarmamızda oldukça yardımcı olmaktadır.

Bir sorguyu Pivot Table ile raporlaştırabilmek için aşağıdaki prototipte olduğu gibi hareket edilmelidir;

SELECT * FROM
(
	SELECT X, COUNT(*) Y FROM [Table1]
	GROUP BY X
) Table2
PIVOT
(
	SUM(Y) FOR X IN([VALUE1], [VALUE2], [VALUE3], [VALUE4], [VALUE5],...)
) PivotTable

Dikkat ederseniz eğer subqueryden gelen verileri externalquery ile “Table2” adında elde etmekte ve “PIVOT” fonksiyonu çağrılarak “IN” parametresine girilen “X” kolonundaki değerler için oluşturulacak kolonlara özel “Y” toplamı basılacaktır. Anlayacağınız “X” kolonunun verilerine özel yatay bir tablo söz konusu olacaktır.

Konuyu örneklendirmek adına “North-Wind” veritabanı üzerindeki “Satislar” tablosunu ele alalım;
SQL Server'da Pivot Table Kullanımı

Dikkat ederseniz “Satislar” tablosunda “SevkSehri” ve “SevkUlkesi” olmak üzere iki adet kolon mevcuttur.

Şimdi…

Gün geldi, şöyle bir soru ve ihtiyaçla karşılaşıldı diyelim;

Hangi şehirde kaç adet satış yapılmıştır?

Bu soruya karşılık olarak yapabileceğimiz en mantıklı hamle aşağıda olduğu gibi şehirleri gruplayıp yapılan işlerin adedini almaktır.
SQL Server'da Pivot Table Kullanımı

İstek ve ihtiyaca dönük doğru ve gereken sonuç elde edildiği için amacımıza ermiş bulunmaktayız. Ama bu tabloyu yatay bir vaziyette ve direkt olarak şehirsel bazda kolonlardan oluşan bir rapor şeklinde elde etmek istiyorsak eğer işte burada devreye Pivot Table girecektir.
SQL Server'da Pivot Table Kullanımı
Görüldüğü üzere anlaşılabilir, okunabilir ve harika bir rapor elde etmiş bulunmaktayız(Bu örnekte tüm şehirler kolon olarak belirtilmemiştir).

Makalemizin içeriğini zenginleştirmek ve ilgili konuya daha çok pratiksel açı kazandırmak maksadıyla bir örnek üzerinde daha inceleme yapmayı tercih ediyorum.
SQL Server'da Pivot Table Kullanımı
Yukarıdaki ekran görüntüsüne göz atarsanız eğer hangi personelin hangi ülkeye kaç satış yaptığını yatay boyutta sonuç veren sorgu yazılmış bulunmaktadır.

Subquery de yapılan inner join işlemi neticesinde elde edilen personel bilgileri, ülke bilgisine özel kolonlara karşılık toplam yapılan satış bilgisini basacak Pivot işlemi esnasında sıkıntısız bir şekilde sonuç tablosuna eklenmiştir.

Bu harika SQL fonksiyonu hakkında bilmenize değer son husus ise büyük boyutlu verilerde performans açısından oldukça maliyetli olmasıdır. Eğer ki performans söz konusu olan ama bir yandan da milyonlarca veri üzerinde işlem yapmanızı gerektiren raporsal çalışmalarınızda bu maliyeti göz önünde tutarak hareket etmenizi tavsiye ederim.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

12 Cevaplar

  1. Mustafa dedi ki:

    merhaba hocam,
    Pivot Table ‘da for….in içerisine yazılan ülkelerin dynamik olarak bir select ile alamaz mıyız?

    bir kaç tane ülke elle yazılabilir ama çok fazla olunca yazmak sıkıntı olabiliyor.

  2. mustafa yıldız dedi ki:

    Bu şekilde denedim hocam izin vermiyor.

    select * from 
    (
    	select s.SevkUlkesi, p.Adi +' '+ p.SoyAdi as personel, COUNT(*) as satisAdedi
    	from Satislar s inner join Personeller p on s.PersonelID = p.PersonelID
    	group by s.SevkUlkesi, p.Adi +' '+ p.SoyAdi
    ) as UlkeSatisAdedi
    PIVOT
    (
    	sum(satisAdedi)
    	/*
    	for SevkUlkesi in ( [Argentina],
    						[Austria],
    						[Belgium],
    						[Brazil],
    						[Canada],
    						[Denmark],
    						[Finland],
    						[France],
    						[Germany],
    						[Ireland])
        */
    	
    	for SevkUlkesi
    	in
    	(select u.SevkSehri as ulkeler from Satislar u group by u.SevkSehri)
    	
    	
    ) as PivotUlkeSatisAdedi
    order by personel
    

    Hata;
    Msg 156, Level 15, State 1, Line 25
    Incorrect syntax near the keyword ‘select’.
    Msg 102, Level 15, State 1, Line 25
    Incorrect syntax near ‘)’.

  3. HUZEYFE dedi ki:

    Merhaba,
    Satır ve kolon toplamlarını aylara göre nasıl alabiliriz?
    Örnek paylaşabilir misiniz?
    Teşekkürler

    • ahmet dedi ki:
      select 
      case MONTH(TARIH)
      WHEN 1 THEN '01-Ocak'
      WHEN 2 THEN '02-Şubat'
      WHEN 3 THEN '03-Mart'
      WHEN 4 THEN '04-Nisan'
      WHEN 5 THEN '05-Mayıs'
      WHEN 6 THEN '06-Haziran'
      WHEN 7 THEN '07-Temmuz'
      WHEN 8 THEN '08-Ağustos'
      WHEN 9 THEN '09-Eylül'
      WHEN 10 THEN '10-Ekim'
      WHEN 11 THEN '11-Kasım'
      WHEN 12 THEN '12-Aralık'
      end  AS AY,
      PERSONELKODU,count(*) ADET FROM TABLOISMI  GROUP BY MONTH(TARIH),PERSONELKODU
      ORDER BY AY
      
    • ahmet dedi ki:
      ) Table2
      PIVOT
      (
       SUM(ADET) FOR AY IN([01-Ocak], [02-Şubat], [03-Mart], [04-Nisan], [05-Mayıs], [06-Haziran], [07-Temmuz], [08-Ağustos], [09-Eylül], [10-Ekim], [11-Kasım], [12-Aralık])
      ) PivotTable
      
  4. Berdan dedi ki:

    Ben de Northwind Database’inin ingilizcesi var. Aşağıdaki şekilde yazarak dinamik sonuç alabilirsiniz.

    DECLARE @cols AS NVARCHAR(MAX)
    DECLARE @query AS NVARCHAR(MAX)
    select @cols = STUFF((SELECT ',' + QUOTENAME(ShipCountry) from Orders O
    inner join Employees E on O.EmployeeID = E.EmployeeID
    group by ShipCountry order by ShipCountry FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'),1,1,'')
     
    set @query = ';WITH CTE AS(
                        select Count(*) as [Sales Quantity],O.ShipCountry,E.FirstName
                        from Orders O
                        inner join Employees E on O.EmployeeID = E.EmployeeID
    					GROUP BY O.ShipCountry, E.FirstName
                    )
                    SELECT FirstName,' + @cols + ' from CTE    
                    pivot(Sum([Sales Quantity]) for ShipCountry in (' + @cols + ')) p '         
    execute(@query);
    
  5. Fırat dedi ki:

    Merhaba
    satır sonlarında toplamı nasıl alabilirim acaba?

  6. Gülşah dedi ki:

    Peki tabloda null gelen yerlere yani o sütun için döndürülecek değer yoksa yerine başka birşey yazmasını sağlayabilir miyiz? anladığım kadarıyla olmuyor. sum(veri) yazan yerde isnull ya da case kullanabilsek olacaktı.

  1. 12 Nisan 2019

    […] yazılarımdan SQL Server’da Pivot Table Kullanımı başlıklı içeriğimde SQL Server’da veriler üzerinden anlam ve okunabilirlik açısından […]

Caner Yelken için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir