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.
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ı
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.