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;
şeklinde kullanacağız. Şimdi örneklerle uygulamalı olarak nasıl çalıştıklarını inceleyelim.
Ö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 |
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.