İlginizi Çekebilir
  1. Ana Sayfa
  2. SQL

SQL Pivot Kullanımı

SQL Pivot Kullanımı
+ - 5

SQL Pivot Kullanımı , yazım ile sql eğitim setime bir yazı daha ekliyorum. Yakın zamanda uğraştığım bir projedeki rapor için pivot kullanmam gerekiyordu. Pivot özelliği ile sql satırları kolon yapabiliyoruz.. Daha fazla uzatmadan gelin görelim.

 

SQL Pivot Kullanımı

Evet, ne demiştik… Satırları kolon olarak almaktan bahsetmiştik. Şimdi bunu nasıl yapacağımızı göreceğiz. SQL satırları kolon yapma işlemini görelim.

Öncelikle senaryomuzu verelim. Yapmak istediğim işlem şudur;

Bir kaç şehirde bir yada daha fazla mağazamız var diyelim. Bu şehirlerden aylık olarak olarak gelen tutarları gösterecek bir rapor yapmak istiyoruz diyelim. Bizde gelen miktarları mağaza mağaza ve satır satır yazdık. Bir içinde birden fazla kez tahsilat yapılmış da olabilir. Bu durumda şehir, mağaza ve tutar bilgilerinin hepsi satır satır olacaktır. Bu satırlardaki Ay bilgilerini kolon olarak yazmak ve tutarları da ay bazında toplamak istiyoruz. Şehirler ve şehirlerden gelen tutarlar satırda, aylar kolonda olacak. Bu şekilde şehir ve ay bazlı tahsilat raporu elde etmiş olacağız.

Şimdi öncelikle sorgumuzu yazıyoruz.

SELECT 
	 tah_ay as AY
	,tah_sehir as ŞEHİR
	,SUM(tah_tahsilat) as TOPLAM
FROM Tablomuz
Where tah_yil = 2018
GROUP BY tah_sehir,tah_ay
order by AY

Şimdi elimizde sorgumuz var. Bu sorgumuzdan gelen sonuç aşağıdaki gibi olacak.

Ocak, Kahramanmaraş, 125896,23

Şubat, Kahramanmaraş, 523896,23

Şubat, İstanbul, 256978,69

Mart, Mersin, 123123123,36

Buradaki ay bilgisini kolon olarak alacağız ve bunu yaparken tutarları toplayacağız.

Şimdi sorgumuzu bir alt sorgu (subquery ) yapıyoruz.

SELECT 
*
 FROM  (
SELECT 
	 tah_ay as AY
	,tah_sehir as ŞEHİR
	,SUM(tah_tahsilat) as TOPLAM
FROM Tablomuz
Where tah_yil = 2018
GROUP BY tah_sehir,tah_ay
order by AY ) K

Gördüğünüz gibi sorgumuz bir alt sorgu haline geldi. Sorgumuzu alt sorgu haline getirmeden pivot uygulamasını yapamıyoruz. Bu sebeple gerekli bir işlemdir. Şimdi asıl işe geliyoruz. SQL Pivot kullanımını gösterelim.

Pivot Kullanımı

PIVOT(SUM(TOPLAM) FOR AY IN ([Ocak],[Şubat],[Mart],[Nisan],[Mayıs],[Haziran],[Temmuz],[Ağustos],[Eylül],[Ekim],[Kasım],[Aralık])) AS PVT

Şimdi, sql Pivot kullanımı için, pivot yazdıktan sonra parantez açıyoruz ve kolon olmasını istediğimiz verinin altında duracak bilgileri işlememiz gerekiyor. Mesela, Ocak ayındaki TOPLAM değerini, Ocak kolonunun altında görmek istiyoruz. Kolon başlıkları olacak bilgileri köşeli parantezler arasında yazıyoruz. Ancak kolon başlığı olacak veriler, For kısmından sonra verdiğimiz asıl kolonun içinde olan veriler olmalıdır. Bu örnekte Ay kolonu verdik, Dikkat ettiyseniz ayların adlarını yazdım çünkü Ay kolonundaki ay bilgisi ay adları olarak yer alıyor. Eğer ay numaraları olsaydı köşeli parantezler arasına ay numaralarını yazmamız gerekirdi.

Şimdi tüm sorguyu verelim.

SELECT 
*
 FROM  (
SELECT 
	 tah_ay as AY
	,tah_sehir as ŞEHİR
	,SUM(tah_tahsilat) as TOPLAM
FROM Tablomuz
Where tah_yil = 2018
GROUP BY tah_sehir,tah_ay
order by AY ) K 
PIVOT(SUM(TOPLAM) FOR AY IN ([Ocak],[Şubat],[Mart],[Nisan],[Mayıs],[Haziran],[Temmuz],[Ağustos],[Eylül],[Ekim],[Kasım],[Aralık])) AS PVT

Sorgumuz da bu şekilde görünüyor. Sorgumuzu çalıştırdığımızda ise elde edeceğimiz sonuç şuna benzer olacaktır.

Şehir,                         Ocak,           Şubat,           Mart, …

Kahramanmaraş,   13245,23,     45789,21,    15478,12, …

Gördüğünüz sql pivot kullanımı da bu şekildedir.


Bu dersimizinde sonuna geldik dostlar, Diğer derslerimizde görüşmek üzere…

Microsoft SQL Server & T-SQL Eğitim Seti ders listesi için tıklayınız.

Sağlıcakla ve Takipte Kalın. ?

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)

Yorumlar (5)

  1. 4 sene önce

    Merhabalar,
    Satır ve kolon dip toplamlarını nasıl aldırabiliriz?
    Örnek paylaşabilir misiniz?

    • Elinizde bir sorgu var ise öncelikle sorgunuzu bir fonksiyon içerisine almanızı tavsiye ederim. Ben bu yazıda verdiğim örneği TahsilatRaporu adında bir fonksiyon içerisine aldım. Anlatımımı da bu örnek üzerinden yapacağım.

      Satır toplamlarını sorgu içerisinde toplayarak alabilirsiniz. Bu durumda sorgunuz aşağıdaki gibi olacak.
      SELECT *
      ,isnull(Ocak+Şubat+Mart+Nisan+Mayıs+Haziran+Temmuz+Ağustos+Eylül+Ekim+Kasım+Aralık,0) Satir_Toplam
      FROM dbo.TahsilatRaporu(2018)

      Buraya kadar satır toplamını aldık ve satırın sonuna eklemiş olduk.

      Bir kolonun toplamını (alt toplamı oluyor aynı zamanda), sum() metodu ile alabilirsiniz. Yeni bir sorgu daha yazıp sadece kolonların alt toplamlarını alacağız. Sonrasında union all ile yukarıdaki sorgu ile alt toplamları aldığımız sorguyu birleştireceğiz. Alt Toplamların sorgusu aşağıdaki gibidir.
      select 'Alt Toplam' , sum(Ocak),sum(Şubat), sum(Mart) ,sum(Nisan),sum(Mayıs),sum(Haziran),sum(Temmuz),sum(Ağustos),sum(Eylül),sum(Ekim),sum(Kasım),sum(Aralık),0
      FROM dbo.TahsilatRaporu(2018)

      Şimdi birleştirelim.

      SELECT * ,
      isnull(Ocak+Şubat+Mart+Nisan+Mayıs+Haziran+Temmuz+Ağustos+Eylül+Ekim+Kasım+Aralık,0) Satir_Toplam
      FROM dbo.TahsilatRaporu(2018)
      union all
      select 'Alt Toplam' , sum(Ocak),sum(Şubat), sum(Mart) ,sum(Nisan),sum(Mayıs),sum(Haziran),sum(Temmuz),sum(Ağustos),sum(Eylül),sum(Ekim),sum(Kasım),sum(Aralık),0
      FROM dbo.TahsilatRaporu(2018)

      Aşağıdaki Bağlantıya tıklayarak görsele ulaşabilirsiniz.
      Çözüm Görseli Bağlantısı
      Çözüm

      Doğru yöntem bu şekilde olmayabilir ama benim aklıma gelen çözüm bu şekildedir. Umarım faydalı olmuştur…

      • Tablo ve Veri olarak yazıdaki örnekleri kullandım. Yorumunuz için hazırladığım fonksiyon aşağıdaki gibidir.

        GO
        /****** Object: UserDefinedFunction [dbo].[TahsilatRaporu] Script Date: 30.05.2021 11:08:30 ******/
        SET ANSI_NULLS ON
        GO
        SET QUOTED_IDENTIFIER ON
        GO

        ALTER FUNCTION [dbo].[TahsilatRaporu]
        (
        @par as int
        )
        RETURNS TABLE
        AS
        RETURN
        (
        SELECT
        ŞEHİR
        ,isnull(Ocak ,0) Ocak
        ,isnull(Şubat ,0) Şubat
        ,isnull(Mart ,0) Mart
        ,isnull(Nisan ,0) Nisan
        ,isnull(Mayıs ,0) Mayıs
        ,isnull(Haziran ,0) Haziran
        ,isnull(Temmuz ,0) Temmuz
        ,isnull(Ağustos ,0) Ağustos
        ,isnull(Eylül ,0) Eylül
        ,isnull(Ekim ,0) Ekim
        ,isnull(Kasım ,0) Kasım
        ,isnull(Aralık ,0) Aralık
        FROM (
        SELECT top 99
        tah_ay as AY
        ,tah_sehir as ŞEHİR
        ,SUM(tah_tahsilat) as TOPLAM
        FROM Tablomuz
        Where tah_yil = @par
        GROUP BY tah_sehir,tah_ay
        order by AY ) K
        PIVOT(SUM(TOPLAM) FOR AY IN ([Ocak],[Şubat],[Mart],[Nisan],[Mayıs],[Haziran],[Temmuz],[Ağustos],[Eylül],[Ekim],[Kasım],[Aralık])) AS PVT
        )

        • Merhaba,
          Bilgi için teşekkür ederim.
          Sizin kodları denedim ancak muvaffak olamadım. Satır ve kolon toplamları gelmiyor.
          Mail olarak gönderdiğim kodları inceler misiniz? Nerede hata yapıyorum?
          Kolay gelsin.

          • Merhaba,
            Öncelikle kodların nasıl çalıştığını anlamak için size verdiğim örnekteki tabloyu açarak içerisine yine örnekte verdiğim verileri yazın. Aynı şekilde yorumdaki fonksiyonu ve kodları aynen tanımlayın. Her şeyin verdiğim yanıttaki gibi olduğuna emin olun ve çalıştığını görün. Sonrasında, kendi tablo ve verilerinizi kullanarak çalışan örnekte olduğu gibi kendi fonksiyon ve kodlarınızı hazırlayın.

            Bir şeyi öğrenebilmek için kullandığım yöntemlerden birisi de budur. Özellikle kavramakta zorlandığım konularda bana her zaman yardımcı olmuştur.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.