ANASAYFA | BLOG | SORU CEVAP | REFERANSLARIM | DOWNLOAD | HAKKIMDA | İLETİŞİM | ARAMA
SQL ALT TOPLAM (ARA TOPLAM)

SQL de yaptığımız sorgulamalarda bazen ara toplam ve alt toplam almamız gerekir. Kolonlara göre gruplamalar yaparak çeşitli dip toplamlar alıp daha sonra da genel toplam alarak bütün sonucu tek bir sorgu ile yapabiliriz. Bu işlemler için Group By işlevini şekillendirerek;

  • Select ... Group By Cube(kolonlar...)
  • Select ... Group By Rollup(kolonlar...)
  • Select ... Group By Grouping Sets(kolonlar...) 

şeklinde kullanacağız. Şimdi örneklerle uygulamalı olarak nasıl çalıştıklarını inceleyelim.

FK-gizle

Öncelikli olarak tablomuzun normal halini görelim. Daha sonra gruplama yaptığımızda neyi nasıl grupladığımızı tabloları karşılaştırarak daha rahat anlayabiliriz.

select il,kisi,tutar from tbSatislar

il kisi tutar
ANKARA Emre ÜNAL 1500
ANKARA Bünyamin AKTAŞ 1250
ŞANLIURFA Halil ADEMOĞLU 1000
KAHRAMANMARAŞ Selçuk ÇÜGEN 1750
ESKİŞEHİR Özlem MELEK 1300
ESKİŞEHİR Faruk ÜNAL 1450
ANKARA Alihsan GÜROL 1900
ŞANLIURFA Cahit ÇEÇEN 1500
ANKARA Faruk ÜNAL 1000
KAHRAMANMARAŞ Selçuk ÇÜGEN 1250
ESKİŞEHİR Faruk ÜNAL 650
ANKARA Faruk ÜNAL 400

illere göre kişilerin yaptığı satış\alış tutarları mevcut.
 

GROUP BY CUBE(kolonlar...)

Belirtilen bütün kolonlar için ayrı ayrı çaprazlama yapılarak her kolonun diğer kolona göre farklı değerler için gruplaması yapılarak toplamları alınır

GROUP BY ROLLUP(kolonlar...)

Belirtilen kolonlar için her kolondaki değere göre gruplama yapılıp toplam işlemi yapılır.

GROUP BY GROUPING SETS(kolonlar...)

Belirtilen kolonlar ayrı ayrı kolon belirtilerek gruplama yapılabilinir. örneğin Grouping Sets(ad,soyad,Rollup(yas)) şeklinde içeride gruplama şekli belirtilebilinir

 

select il,SUM(tutar) from tbSatislar Group by Cube(il)

il Column1
ANKARA 6050
ESKİŞEHİR 3400
KAHRAMANMARAŞ 3000
ŞANLIURFA 2500
  14950



select il,SUM(tutar) from tbSatislar Group by Rollup(il)

il Column1
ANKARA 6050
ESKİŞEHİR 3400
KAHRAMANMARAŞ 3000
ŞANLIURFA 2500
  14950



select il, SUM(tutar) from tbSatislar Group by GROUPING SETS(il)

il Column1
ANKARA 6050
ESKİŞEHİR 3400
KAHRAMANMARAŞ 3000
ŞANLIURFA 2500



Üstteki 3 örneği incelediğimizde CUBE() ve ROLLUP() yardımcı fonksiyonlarının alt toplam da aldığını görürüz. Şimdi aynı işlemleri kolon sayısını arttırarak tekrarlayalım. Bu sefer kolonlara göre farklı ara toplamlar da alma işlemini göreceğiz.

*NOT: Görsel olarak çıktılarımızın göze hitap etmesi ve daha anlaşılır olması açısından isnull() operatörünü kullanabiliriz. Böylelikle okunurluğunu da kolaylaştırmış oluruz.

select isnull(il,'GENEL TOPLAM'),SUM(tutar) from tbSatislar
Group by Cube(il)

Column1 Column2
ANKARA 6050
ESKİŞEHİR 3400
KAHRAMANMARAŞ 3000
ŞANLIURFA 2500
GENEL TOPLAM 14950

 

 

select ISNULL(il,'ILLERIN TOPLAMINDA'), ISNULL(kisi,'KISILERIN TOPLAMI'),
SUM(tutar)[tutar] from tbSatislar Group by Cube(il,kisi)

Column1 Column2 tutar
ANKARA Alihsan GÜROL 1900
ILLERIN TOPLAMINDA Alihsan GÜROL 1900
ANKARA Bünyamin AKTAŞ 1250
ILLERIN TOPLAMINDA Bünyamin AKTAŞ 1250
ŞANLIURFA Cahit ÇEÇEN 1500
ILLERIN TOPLAMINDA Cahit ÇEÇEN 1500
ANKARA Emre ÜNAL 1500
ILLERIN TOPLAMINDA Emre ÜNAL 1500
ANKARA Faruk ÜNAL 1400
ESKİŞEHİR Faruk ÜNAL 2100
ILLERIN TOPLAMINDA Faruk ÜNAL 3500
ŞANLIURFA Halil ADEMOĞLU 1000
ILLERIN TOPLAMINDA Halil ADEMOĞLU 1000
ESKİŞEHİR Özlem MELEK 1300
ILLERIN TOPLAMINDA Özlem MELEK 1300
KAHRAMANMARAŞ Selçuk ÇÜGEN 3000
ILLERIN TOPLAMINDA Selçuk ÇÜGEN 3000
ILLERIN TOPLAMINDA KISILERIN TOPLAMI 14950
ANKARA KISILERIN TOPLAMI 6050
ESKİŞEHİR KISILERIN TOPLAMI 3400
KAHRAMANMARAŞ KISILERIN TOPLAMI 3000
ŞANLIURFA KISILERIN TOPLAMI 2500

Gördüğünüz gibi CUBE() işleminde bütün kolonlar birbirleri ile çaprazlanarak sonuçlar listelenmiştir



select ISNULL(il,'ILLERIN TOPLAMINDA'), ISNULL(kisi,'KISILERIN TOPLAMI'),
SUM(tutar) from tbSatislar Group by Rollup(il,kisi)

Column1 Column2 Column3
ANKARA Alihsan GÜROL 1900
ANKARA Bünyamin AKTAŞ 1250
ANKARA Emre ÜNAL 1500
ANKARA Faruk ÜNAL 1400
ANKARA KISILERIN TOPLAMI 6050
ESKİŞEHİR Faruk ÜNAL 2100
ESKİŞEHİR Özlem MELEK 1300
ESKİŞEHİR KISILERIN TOPLAMI 3400
KAHRAMANMARAŞ Selçuk ÇÜGEN 3000
KAHRAMANMARAŞ KISILERIN TOPLAMI 3000
ŞANLIURFA Cahit ÇEÇEN 1500
ŞANLIURFA Halil ADEMOĞLU 1000
ŞANLIURFA KISILERIN TOPLAMI 2500
ILLERIN TOPLAMINDA KISILERIN TOPLAMI 14950

ROLLUP() işleminde aldığımız çıktı daha berraktır. İllere göre kişilerin dağılımı ve her il için ara toplam ve en sonunda da genel olarak alt toplam işlemi yapılmıştır.




select  ISNULL(il,'ILLERIN TOPLAMINDA'), ISNULL(kisi,'KISILERIN TOPLAMI'),
SUM(tutar) from tbSatislar Group by GROUPING SETS(il,kisi)

Column1 Column2 Column3
ILLERIN TOPLAMINDA Alihsan GÜROL 1900
ILLERIN TOPLAMINDA Bünyamin AKTAŞ 1250
ILLERIN TOPLAMINDA Cahit ÇEÇEN 1500
ILLERIN TOPLAMINDA Emre ÜNAL 1500
ILLERIN TOPLAMINDA Faruk ÜNAL 3500
ILLERIN TOPLAMINDA Halil ADEMOĞLU 1000
ILLERIN TOPLAMINDA Özlem MELEK 1300
ILLERIN TOPLAMINDA Selçuk ÇÜGEN 3000
ANKARA KISILERIN TOPLAMI 6050
ESKİŞEHİR KISILERIN TOPLAMI 3400
KAHRAMANMARAŞ KISILERIN TOPLAMI 3000
ŞANLIURFA KISILERIN TOPLAMI 2500

GROUPING SETS() işlemi ile de illere göre ayrı olarak ve kisilere göre de ayrı olarak gruplama yapıp sonuçlarını özetlemiş olduk.  Şimdi bir de GROUPING SET( Rollup()) şeklinde kullanarak içerden tekrar grup yapma işlemine bakalım. Bu işlemle oluşan sonuç kısmen yada tamamen Group By rollup() işlemindekine benzer. Eğer GROUPING SET( Rollup())  şeklinde kullnırsak direk olarak aynısı oluşur. ama GROUPING SET( kolonlar,,,Rollup()) şeklinde kullanırsak farklı sonuç alırız.

select  ISNULL(il,'ILLERIN TOPLAMINDA'), ISNULL(kisi,'KISILERIN TOPLAMI'),
SUM(tutar) from tbSatislar Group by GROUPING SETS(ROLLUP(il,kisi))

Column1 Column2 Column3
ANKARA Alihsan GÜROL 1900
ANKARA Bünyamin AKTAŞ 1250
ANKARA Emre ÜNAL 1500
ANKARA Faruk ÜNAL 1400
ANKARA KISILERIN TOPLAMI 6050
ESKİŞEHİR Faruk ÜNAL 2100
ESKİŞEHİR Özlem MELEK 1300
ESKİŞEHİR KISILERIN TOPLAMI 3400
KAHRAMANMARAŞ Selçuk ÇÜGEN 3000
KAHRAMANMARAŞ KISILERIN TOPLAMI 3000
ŞANLIURFA Cahit ÇEÇEN 1500
ŞANLIURFA Halil ADEMOĞLU 1000
ŞANLIURFA KISILERIN TOPLAMI 2500
ILLERIN TOPLAMINDA KISILERIN TOPLAMI 14950

Gördüğünüz gibi üstte yaptığımız ROLLUP() örneğindeki sonuç ile aynı sonucu üretmiş olduk


select  ISNULL(il,'ILLERIN TOPLAMINDA'), ISNULL(kisi,'KISILERIN TOPLAMI'),
SUM(tutar) from tbSatislar Group by GROUPING SETS(il,ROLLUP(kisi))

Column1 Column2 Column3
ILLERIN TOPLAMINDA Alihsan GÜROL 1900
ILLERIN TOPLAMINDA Bünyamin AKTAŞ 1250
ILLERIN TOPLAMINDA Cahit ÇEÇEN 1500
ILLERIN TOPLAMINDA Emre ÜNAL 1500
ILLERIN TOPLAMINDA Faruk ÜNAL 3500
ILLERIN TOPLAMINDA Halil ADEMOĞLU 1000
ILLERIN TOPLAMINDA Özlem MELEK 1300
ILLERIN TOPLAMINDA Selçuk ÇÜGEN 3000
ILLERIN TOPLAMINDA KISILERIN TOPLAMI 14950
ANKARA KISILERIN TOPLAMI 6050
ESKİŞEHİR KISILERIN TOPLAMI 3400
KAHRAMANMARAŞ KISILERIN TOPLAMI 3000
ŞANLIURFA KISILERIN TOPLAMI 2500

ROLLUP(kisi) dediğimiz için aratoplam aldı, eğer Rollup() kullanmasaydık bi önceki örnekte olduğu gibi olacaktı. Burda birdan fazla kolon belirterek de istediğimiz sorgulara uygun query leri oluşturabiliriz.

 




Diğer Yazılarımdan Seçmeler...