GROUP BY ile Cube ve Rollup ifadelerinin kullanilmasi
Bildigimiz gibi group by ifadesi istedigimiz kolonlara göre veri setimizi gruplar. Bu makalemizde group by deyimine fazla deginmeyecegiz. Group by ile grupladigimiz bir veri setinde ara toplamlari bulmak için kullanilan cube ve rollup ifadelerini inceleyecegiz.
Cube ve Rollup deyimleri örnek ile anlayacak olursak
Örnegin asagidaki gibi bir tablomuz var;
Cins |
Sehir |
Adet |
Köpek |
Ankara |
25 |
Kedi |
Ankara |
32 |
Tavsan |
Ankara |
8 |
Köpek |
Konya |
10 |
Kedi |
Konya |
21 |
Tavsan |
Konya |
4 |
Köpek |
Yozgat |
100 |
Kedi |
Yozgat |
50 |
Tavsan |
Yozgat |
18 |
Köpek |
Ankara |
5 |
Kedi |
Konya |
13 |
Tavsan |
Yozgat |
18 |
Köpek |
Konya |
6 |
Bu tablo için group by kullanarak verileri çekecek olursak;
SELECT Cins ,Sehir ,sum(Adet) as Adet FROM [EvcilHayvan] group by Cins,Sehir |
Sorgu sonucu:
Cins |
Sehir |
Adet |
Kedi |
Ankara |
32 |
Köpek |
Ankara |
30 |
Tavsan |
Ankara |
8 |
Kedi |
Konya |
34 |
Köpek |
Konya |
16 |
Tavsan |
Konya |
4 |
Kedi |
Yozgat |
50 |
Köpek |
Yozgat |
100 |
Tavsan |
Yozgat |
36 |
Gördügünüz gibi Cins ve Sehir bazinda hayvan adetleri gruplanarak sonuca yansidi.
Ayni tabloya rollup kullanarak group by yaparsak;
.
SELECT Cins ,Sehir ,sum(Adet) as Adet FROM [EvcilHayvan] group by Cins,Sehir with rollup |
Sorgu sonucu
Cins |
Sehir |
Adet |
Kedi |
Ankara |
32 |
Kedi |
Konya |
34 |
Kedi |
Yozgat |
50 |
Kedi |
NULL |
116 |
Köpek |
Ankara |
30 |
Köpek |
Konya |
16 |
Köpek |
Yozgat |
100 |
Köpek |
NULL |
146 |
Tavsan |
Ankara |
8 |
Tavsan |
Konya |
4 |
Tavsan |
Yozgat |
36 |
Tavsan |
NULL |
48 |
NULL |
NULL |
310 |
Yukaridaki sonuçta görebileceginiz gibi rollup ifadesi her hayvan cinsi için Sehir ayrimi olmadan(sehir alanlari null geliyor) toplam kaç adet olduklari bilgisini de getirdi. Kisacasi ara toplamlari buldu. Ayrica sonuç tablosunun en sonunda cins ve sehir ayrimi olmadan topla kaç adet hayvan oldugu bilgisi de geldi.
Simdi ayni sorguyu cube ifadesi ile çalistirirsak ne olur;
SELECT Cins ,Sehir ,sum(Adet) as Adet FROM [EvcilHayvan] group by Cins,Sehir with cube |
Sorgu sonucu:
Cins |
Sehir |
Adet |
Kedi |
Ankara |
32 |
Köpek |
Ankara |
30 |
Tavsan |
Ankara |
8 |
NULL |
Ankara |
70 |
Kedi |
Konya |
34 |
Köpek |
Konya |
16 |
Tavsan |
Konya |
4 |
NULL |
Konya |
54 |
Kedi |
Yozgat |
50 |
Köpek |
Yozgat |
100 |
Tavsan |
Yozgat |
36 |
NULL |
Yozgat |
186 |
NULL |
NULL |
310 |
Kedi |
NULL |
116 |
Köpek |
NULL |
146 |
Tavsan |
NULL |
48 |
Dikkat ederseniz rollupda sadece sehir kolonu null gelmisti yani cinsler için ara toplamlari bulmustu, cube ise group by içinde kullanilan tüm kolonlar için ara toplamlari buldu. Yukarida gördügümüz gibi Her cinsten toplam kaç havyan var ve her sehirde cins ayrimi olmadan kaç hayvan var bilgileri sorgu sonucuna eklendi.
.
duzeltme
SELECT Cins,Sehir, MAX(Adet) as Adet
FROM [EvcilHayvan]
group by Cins,Sehir
Asagidaki sekilde en performansli olur Mehmet Yilmaz..
SELECT Cins,Sehir, MAX(Adet) as Adet
FROM [EvcilHayvan]
merhaba,
her sehir için en çok hangi hayvandan ve kaç tane var sorusunun cevabini asagidaki sorgu ile alabiliriz.
WITH Sirala AS
(
select Sira = (row_number() over(partition by Sehir order by Sehir,Cins,sum(Adet)))
, Sehir,Cins,sum(Adet) TAdet from EvcilHayvan
group by Sehir,Cins
)
SELECT *
FROM Sirala
WHERE Sira = 1
Peki hocam, hangi sehirlerde en çok hangi hayvan varsa onlari listelemek nasil olur (en performansli)
sonuç asagidaki gibi çikmali.
Kedi Ankara 32
Kedi Konya 36
Köpek Yozgat 100