Bazen gruplama yaparak ona göre sonuçları listelemek isteriz. Normal olarak tek tek bütün durumlara göre sorgulama yapmak hem zaman açısından hemde performans açısından pek tercih edilmez. GROUP BY ifadesi kullanılarak ulaşmak istenilen sonuca çok daha pratik bi şekilde ulaşılabilinir. Örneğin elimizdeki bir veride il il, hangi ilden kaç kişi A ürününü almış şeklinde bir analiz yapmak istediğimizi düşünelim. Normal sorgulama şekliyle hareket edersek bütün şehirler için teker teker bu sonucu üretecek sorguyu çalıştırıp sonuçlarını kaydetmemiz gerekir. Halbuki bunun yerine GROUP BY ifadesi ile tek sorguda isteninlen sonuçlara gruplama yapılarak ulaşılması mümkündür. Şimdi daha detaylı olarak örneklerle birlikte inceleyeceğiz...
Öncelikle tablomuzun ilk halini görüntüleyelim. Yapılan kampanyalara göre satış kaydının tutulduğu örnek listemiz aşağıdadır.
kampanya | kisi | urun | tutar | sehir | meslek |
---|---|---|---|---|---|
1 | Melek | PC | 1250 | ANKARA | ev hanımı |
1 | Ruya | TV | 1000 | ev hanımı | |
1 | Halil | laptop | 1350 | SANLIURFA | emekli |
1 | Yunus | TV | 1500 | ANKARA | muhendis |
1 | Ruya | PC | 1100 | AYDIN | ev hanımı |
2 | Ozgu | PC | 1000 | AYDIN | doktor |
2 | Halil | laptop | 1400 | SANLIURFA | emekli |
2 | Yunus | TV | 1500 | AYDIN | esnaf |
2 | Faruk | PC | 1300 | ANKARA | muhendis |
3 | Melek | PC | 1150 | SANLIURFA | ev hanımı |
3 | Yunus | PC | 1050 | esnaf | |
3 | Faruk | laptop | 1400 | ANKARA | muhendis |
ilk başta mesela 1numaralı kampanyadan yararlanan kişi sayısını çekelim. Bunun için kullanacağımız sorgu
select
COUNT
(*) [sayisi]
from
tbSatis
where
kampanya=1
sayisi |
---|
5 |
ama sadece bir kampanya için değilde bunu bütün kampanyalar için sorgulamak istersek o zaman ya bu sorgudaki where koşulunu değiştire değiştire bütün kampanya numaraları için query çalıştırıcaz yada daha kolay çözüm olan GROUP BY ifadesini kullanacağız.
Gruplama yaparken kesinlikle aggreegate fonksiyonlarını kullanmamız gerekir. Bununla birlikte gruplama yapacağımız kolonu da belirterek sonuçlarımızın anlaşılırlığını kolaylaştırmış oluruz. GROUP BY ifadesi ile birlikte en az 1 tane kolon belirtmemiz gerekir. Aksi halde hata alırız.
Şimdi tekrar yukarıdaki örneğimize dönecek olursak her kampanya için kaç kişinin katıldığını, kampanya kolonuna göre gruplama yaparak bulabiliriz. Bunun için yazacağımız query şu şekilde olacaktır.
select
kampanya,
COUNT
(*) [sayisi]
from
tbSatis
GROUP
BY
kampanya
kampanya | sayisi |
---|---|
1 | 5 |
2 | 4 |
3 | 3 |
Gördüğünüz gibi her kampanya için toplam o kampanyadan yararlanan kişi sayısını öğrenmiş olduk. ilk sorgumuzda sadece 1 numaralı kampanya için 5 kişinin yararlandığını görmüştük. Bu sorgumuzda diğer sorguya göre daha pratik olarak tek query çalıştırarak bütün kampanyaları listelemiş olduk. Burda gruplama yaptığımız kolonu select
ifadesine yazmak zorunda değildik. Fakat öyle bir durumda gelen sonucun neye ait olduğunu bilemeyeceğimizden genelikle (%97.81) group by ifadesi ile birlikte kullanılan kolonlar, select
ifadesinde de yer alır. Aksi durumda oluşacak tablo şu şekilde olacaktır ve pek bi anlam ifade etmeyeceği aşikardır.
select
COUNT
(*) [sayisi]
from
tbSatis
GROUP
BY
kampanya
sayisi |
---|
5 |
4 |
3 |
Gördüğünüz gibi kampanyalardan yararlanan kişi sayıları geldi ama hangi kampanyadan kaç kişinin yararlandığı belli değil. Bu yüzden GROUP BY ifadesi ile kullandığınız kolonları sorgu sonucuna yansıtmanız sizin lehinize olacaktır.
Şimdi de hangi üründen kampanya kapsamında kaç adet satılmış onu görelim.
select
urun,
COUNT
(*) [sayisi]
from
tbSatis
GROUP
BY
urun
urun | sayisi |
---|---|
laptop | 3 |
PC | 6 |
TV | 3 |
Yukarıdaki tabloda görüldüğü gibi hangi ürün kaç tane satılmış, ürün bazlı gruplama yapılarak hesaplanmıştır.
GROUP BY ifadesi ile birlikte bütün aggregate fonksiyonları kullanmak mümkündür. Şimdi de kampanyalardaki toplam satış tutarlarını listeleyelim. Bunun için yazacağımız query de diğerlerine benziyor. Tek fark diğerlerinde satır sayısı listeliyorken bunda toplam listeleyeceğiz yani SUM() fonksiyonunu kullanacağız ve kampanyaya göre gruplayıp sonucu göreceğiz.
select
kampanya,
SUM
(tutar) [tutar]
from
tbSatis
GROUP
BY
kampanya
kampanya | tutar |
---|---|
1 | 6200 |
2 | 5200 |
3 | 3600 |
Bu şekilde bütün aggregate fonksiyonlar ile gruplama işlemi yapabilirsiniz.
BİRDEN FAZLA KOLONU GRUPLAMAK
GROUP BY ifadesinden sonra gruplama yapılacak kolonlar aralarında virgül olacak şekilde yazılır. Bu kolonların select cümleciğinde de olması sonuçların okunurluğu açısından önemlidir. Yine yukarıdaki tablomuz üzerinde çalışacak olusak hangi kişiler hangi ürünlerden kaç tane almışlar yada başka bir deyişle, kim hangi üründen kaç tane almış bunları listeleyelim.
select
kisi,urun,
COUNT
(*) [sayisi]
from
tbSatis
GROUP
BY
kisi,urun
kisi | urun | sayisi |
---|---|---|
Faruk | laptop | 1 |
Halil | laptop | 2 |
Faruk | PC | 1 |
Melek | PC | 2 |
Ozgu | PC | 1 |
Ruya | PC | 1 |
Yunus | PC | 1 |
Ruya | TV | 1 |
Yunus | TV | 2 |
Listede görüldüğü üzere kim hangi üründen kaç tane almış listeleniş olduk. Eğer sorgularımızın sonucunu sıralamak istersek en sona ORDER BY ifadesi ekleyerek sıralama yapabiliriz. kişiye göre sıralama yaparak aynı sorguyu tekrar çekecek olursak daha okunaklı bir liste alabiliriz.
select
kisi,urun,
COUNT
(*) [sayisi]
from
tbSatis
GROUP
BY
kisi,urun
order
by
kisi
kisi | urun | sayisi |
---|---|---|
Faruk | laptop | 1 |
Faruk | PC | 1 |
Halil | laptop | 2 |
Melek | PC | 2 |
Ozgu | PC | 1 |
Ruya | PC | 1 |
Ruya | TV | 1 |
Yunus | PC | 1 |
Yunus | TV | 2 |
NULL DEĞERLERİ GRUPLAMAK
Gruplama yaptığımız kolonlarda NULL değerine sahip kolonlar da olabilir. Böyle durumlarda NULL değerlerde kendi içlerinde gruplanarak sonuç gösterilir. Örneğin tablomuzun ilk haline tekrar bakacak olursak
kampanya | kisi | urun | tutar | sehir | meslek |
---|---|---|---|---|---|
1 | Melek | PC | 1250 | ANKARA | ev hanımı |
1 | Ruya | TV | 1000 | ev hanımı | |
1 | Halil | laptop | 1350 | SANLIURFA | emekli |
1 | Yunus | TV | 1500 | ANKARA | muhendis |
1 | Ruya | PC | 1100 | AYDIN | ev hanımı |
2 | Ozgu | PC | 1000 | AYDIN | doktor |
2 | Halil | laptop | 1400 | SANLIURFA | emekli |
2 | Yunus | TV | 1500 | AYDIN | esnaf |
2 | Faruk | PC | 1300 | ANKARA | muhendis |
3 | Melek | PC | 1150 | SANLIURFA | ev hanımı |
3 | Yunus | PC | 1050 | esnaf | |
3 | Faruk | laptop | 1400 | ANKARA | muhendis |
Şehir kolonuna dikkat edersek iki satırda şehir bilgisinin girilmediğini görürüz. Hangi şehirden kaç kişi kampanyalardan yararlanmış gibi bir sorgu çalıştırarak şehir kolonu üzerinde gruplama yapacak olursak NULL değerlerinde gruplanmış olduğunu görürüz
select
sehir,
COUNT
(*) [sayisi]
from
tbSatis
GROUP
BY
sehir
sehir | sayisi |
---|---|
2 | |
ANKARA | 4 |
AYDIN | 3 |
SANLIURFA | 3 |
Gördüğünüz gibi NULL değerler de kendi aralarında hesaplandı ve şehir belirtilmemiş 2 satır olduğunu da listelemiş olduk.