SQL 4 : Group By ile Gruplandırma

Group By fonksiyonu SQL‘de gruplandırma yapmak için kullanılır. Genellikle bir “Çoklu Satır Fonksiyonu (Aggregate Function)” ile beraber kullanılır.

Bildiğiniz gibi Çoklu satır fonksiyonları bir sütundaki verileri, bir işleme sokarak tek bir değer döndürür. Siz eğer tek değer döndürmesini istemiyorsanız, yani her grup için ayrı ayrı hesap yapmasını istiyorsanız Group By ile işlem yapabilirsiniz.

Çok uzatmadan, aşağıdaki tablo üzerinde Group By fonksiyonu ile birkaç gruplandırma yapalım.

Film_No Ad Tarih IMDB_Puan
1 The Shawshank Redemption 1994 9,2
2 The Dark Knight 2008 8,8
3 Fight Club 1999 8,8
4 Forrest Gump 1994 8,6
5 Leon 1994 8,6
6 V For Vandetta 2006 8,1
7 A Beautiful Mind 2006 8,0
8 Eternal Sunshine of the Spotless Mind 2004 8,4
9 Inception 2010 8,8
10 Good Will Hunting 1997 8,1

Seneye göre, her sene kaç film çıktığını gösterelim. Yani tarihe göre gruplandırma yapalım.

SELECT Tarih, COUNT(*) AS Film_Adet
FROM Filmler
GROUP BY Tarih

Bu şekilde tarihe göre gruplandırma yapabilirsiniz.

Group By fonksiyonunu kullanırken, SELECT ile seçtiğiniz sütun ismini Group By deyiminin yanına yazmalısınız. Aksi halde sorgu çalışmayacaktır. Mesela aşağıdaki gibi bir sorgu yanlıştır ;

SELECT Tarih, SUM(IMDB_Puan)
FROM Filmler

SELECT sorgusu Tarih sütunu için 10 farklı değer döndürürken, SUM fonksiyonu için sadece bir değer döndürür. Dolayısıyla istediğiniz sonuca ulaşamazsınız.

Tarihe göre, o tarihte çıkmış filmlerin ortalama puanlarını elde eden bir sorgu yapalım ;

SELECT Tarih, AVG(IMDB_Puan)
FROM Filmler
GROUP BY Tarih

IMDB Puanlarına göre, o IMDB puanını alan kaç adet film olduğunu bulan bir sorgu yazalım ;

SELECT IMDB_Puan, COUNT(IMDB_Puan) AS Adet
FROM Filmler
GROUP BY IMDB_Puan

HAVING ile Gruplamaya Kriter Belirleme

Group By fonksiyonunu bir kriter ile beraber kullanmak isterseniz WHERE yerine, HAVING kullanmanız gerekiyor. Gruplandırma koşullarını HAVING ile yapmalısınız.

2000’den sonraki her bir tarih için ortalama IMDB_Puanlarına bir bakalım ;

SELECT Tarih, AVG(IMDB_Puan)
FROM Filmler
GROUP BY Tarih
HAVING Tarih > 2000

Sonuç

Group By fonksiyonu, gruplandırma yapmak için kullanılır. Genellikle de bir aggregate fonksiyon ile beraber kullanılır.

Eğer gruplandırmaya bir koşul belirlemek istiyorsanız HAVING komutunu kullanmalısınız. Normalde WHERE olan kriter belirleme komutu, gruplandırma söz konusu ise HAVING olmaktadır.

Benzer Yazılar

Yorumlar

  • Ali , 12 Haziran 2012 - 18:09:52

    Tablodaki veriler de severek izlediğin filmler sanırım ;) izlemediğim birkaç tane var bi bakayım ben onlara..
    Paylaşım için teşekkürler, terazine tık .

    Cevapla
  • Çağatay , 04 Eylül 2012 - 03:07:52

    Bugüne kadar okuduğum en sade, en açık ve en faydalı SQL makaleleri… Emeğinize sağlık, Çok Teşekkürler…

    Cevapla
  • ahmet , 09 Mayıs 2013 - 11:15:52

    çok faydalı bir olmuş. teşekkür ederim

    Cevapla
  • mehmet , 20 Aralık 2013 - 01:04:33

    Çok güzel bir anlatım olmuş teşekkürler.Çalışmalarınızın devamını bekliyoruz

    Cevapla
  • artgel , 08 Mart 2014 - 10:07:08

    son örnekte GROUP BY’dan sonra Tarih yerine yanlışlıkla Filmler yazılmış galiba.

    SELECT Tarih, AVG(IMDB_Puan)
    FROM Filmler
    GROUP BY Tarih
    HAVING Tarih > 2000

    Cevapla
  • fatih , 20 Kasım 2014 - 01:45:32

    sınav öncesi çok işime yaradı.çok teşekkürler.sitenizde çok faydalı bilgiler buldum.devamı gelmesi dileğiyle

    Cevapla
  • Antik Çağ , 16 Mayıs 2015 - 14:38:13

    Açıklayıcı ve güzel bir çalışma olmuş ellerinize sağlık.

    Cevapla
  • sedat nacitarhan , 02 Eylül 2015 - 09:58:01

    merhablar

    bir tablom/database mevcut

    her yeni iş için dosyano, protokol, ad, tcno, soyad, telefon şeklinde alanlara kayıtlar giriliyor. dosyano aynı değer olamıyor ama ad-soyad-tcno-telefon aynı deeğrler olabiliyor.
    şunu yapmak istiyorum

    aynı tcno kayıtları ayıklayıp tüm tabloyu listelemk istiyorum

    SELECT DOSYANO, PROTOKOL, AD, SOYAD, TCNO, TELEFON FROM TABLOADI
    GROUP BY TCNO

    bu komut ile yapamadım,
    SELECT TCNO FROM TABLOADI GROUP BY TCNO
    ile sadece bir alan (tcno) ile guruplama yaparak kayıtları bire indirebiliyorum fakata diğer alan adlarını da görmek istediğim için işime yaramıyor.
    yardımcı olursanız sevinirim

    Cevapla
  • Umut , 19 Kasım 2016 - 16:48:12

    SELECT ad
    FROM Filmler
    GROUP BY Tarih
    HAVING IMDB_Puan > AVG(IMDB_Puan)
    diyerek tarihe göre gruplandirip IMDB puan ortalamasindan yüksek olanlarin isimlerini verebilirmiyiz yoksa bunun icin baska bir kod mu yazmaliyiz ?

    Cevapla
  • cuneyt , 26 Mart 2018 - 10:54:34

    Merhaba Hocam,

    SELECT S.KOD2 AS MARKA, SUM(SHT.TUTAR) AS TOPLAMSATIS
    FROM F0105TBLSTOKLAR S
    INNER JOIN F0105D0010TBLSTOKHAREKETLERI SHT ON SHT.STOKNO = S.IND
    WHERE SHT.IZAHAT=21
    GROUP BY S.KOD2;

    Yukarıdaki sql kodları ile markalara ait toplam satış tutarlarını çekebiliyorum. Ancak markaların ocak,subat,mart şeklinde aylık satışlarını alamıyorum. Yardımcı olursanız çok sevinirim.

    Cevapla

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla