ANASAYFA | BLOG | SORU CEVAP | REFERANSLARIM | DOWNLOAD | HAKKIMDA | İLETİŞİM | ARAMA
SQL GROUP BY - GRUPLAMA YAPMAK

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

FK-gizle

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

 




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