Kenan kılıçaslan

  • Baca Hesabı
  • Sürtünme Kaybı
  • Diferansiyel Denklem
  • Denklem Çözümü
SQL Server

Gruplama Sorguları

Bu tip sorgular kolon düzeyinde çalışan sorgulardır.

1- Tablodaki kayıt sayısı bulunabilir.

Kayıt sayısı bilmek hangi işimizi görür? Ne işimize yarar? Örneğin müşteri tablosunu düşünelim, tablonun her kaydında farklı müşteri vardır. Kayıt sayısını bulursak müşteri sayısını bulmuş oluruz.

Örneğin, öğrenci tablosunun her kaydında farklı öğrenci vardır. Dolayısıyla kayıt sayısı, öğrenci sayısına eşittir.

2- Kolondaki rakamlar toplanabilir.

Örneğin, müşterilerin borçları toplamı, depodaki ürünlerin toplamı vs. bulunabilir.

3- Kolondaki en büyük ve en küçük rakamları bulabiliriz.

Örneğin, öğrenci not tablosunda en büyük ve en küçük notları bulabiliriz.

4- Kolondaki rakamların ortalamasını bulabiliriz.

Öğrenci not tablosunda notların ortalamasını bulabiliriz.

5- Kolondaki rakamların standart sapmasını bulabiliriz.

Öğrenci not tablosunda notların standart sapmasını bulabiliriz.

Yukarıdaki işlemleri yapan fonksiyonlara AGGREGATE fonksiyonları adı verilir.

AGGREGATE Fonksiyonları

COUNT() : Kayıt sayısını verir
SUM () : Kolon toplamını verir
MAX() : Kolondaki en büyük rakam değerini verir
MIN() : Kolondaki en küçük rakam değerini verir.
AVG() : Kolon ortalama değerini verir
STDEV() : Kolondaki rakamların standart sapmasını verir.

Açıklama: COUNT() fonksiyonu hariç, diğer fonksiyonlar NULL değerleri dikkate almazlar.

En genel ifade

SELECT ..1.. FROM ..2.. WHERE ..3.. GROUP BY ..4.. 
                        HAVING ..5... ORDER BY ..6.. 

1 nolu yere, Aggregate fonksiyonu yazılabilir.

SELECT count(*) ... 
SELECT sum(notu) ... 
Select avg(notu) ... 

Başka neler yazılabilir? GROUP BY deyimi içindekiler yazılabilir.

2 nolu yere, tablo adı yazılır

3 nolu yere (WHERE), buradaki süzme işlemi gruplama öncesi çalışır.

Örnek : 1 nolu bolumde kaç tane not var bulalım.

SELECT count(*) FROM notlar WHERE bolumno=1 

4 nolu yere (GROUP BY), gruplama yapacağımız kolon isimleri veya denklemler yazılır. Eğer GROUP BY sorguda bulunmaz ise tüm tablo bir gruptur.

5 nolu yere (HAVING), Gruplama yapılmış, sonuç elde edilmiş, bir liste oluşmuş. Bu durumda süzme işlemi yapacaksak HAVING deyimi kullanılır. Having deyimi içindeki koşulda group by deyimi içindeki ifadeler bulunabilir veya aggregate fonksiyonları kullanılabilir.

Not :GROUP BY deyimi kullanılmadıysa HAVING kullanılamaz.

6 nolu yere, (ORDER BY), sıralama için ORDER BY deyimi içindeki ifadeler veya aggregate fonksiyonları bulunabilir. Eğer group by deyimi yoksa, order by kullanılamaz.

Gruplama Sorgusu Örnekleri

Aşağıdaki tablo üzerinden örnek sorulara cevap verelim.

Soru:Fatura tablosunu FaturaNo’suna göre gruplayınız ve her bir faturadaki miktar toplamını bulunuz.

Bu problemi aşama aşama çözelim.

1. aşama olarak tablodaki tüm kayıtların miktar toplamını bulalım.

SELECT sum(miktar) FROM Fatura

Yukarıdaki kod Fatura tablosundaki miktar toplamını verdi.

2. aşama olarak FaturaNo’suna gruplayalım

SELECT sum(miktar) FROM Fatura GROUP BY FaturaNo

Yukarıdaki çıktıdaki rakamlar hangi fatuya ait belli değil. Bu rakamların yanına FaturaNo’sunu koyalım.

SELECT FaturaNo, sum(miktar) FROM Fatura GROUP BY FaturaNo

Yukarıdaki sorgunun çıktısında miktar toplamı kolonun bir adı yok. Bu kolona ToplamMiktar adını verelim.

SELECT FaturaNo, sum(miktar) as ToplamMiktar 
                       FROM Fatura GROUP BY FaturaNo

Birkaç adet hatalı kod yazalım.

SELECT FaturaNo, sum(miktar) as ToplamMiktar FROM Fatura 

Hata nedeni; sorguda bulunan FaturaNo aggregate fonksiyonu değil veya GROUP BY cümlesi içinde yer almıyor. Yani, GROUP BY FaturaNo şeklinde bir ifadeyi sorgu içermeliydi. Gruplama yapmadığımız ve yaptığımız toplama işlemi tüm kolonu kapsaması nedeniyle, bu bilgi FaturaNo ile ilişkilendirilemez.

SELECT FaturaNo, sum(miktar) as ToplamMiktar 
                FROM Fatura GROUP BY urunKodu

Hata nedeni; biz UrunKoduna göre grupladık ancak FaturaNo yazdırmaya çalışıyoruz. Burada her urunKodu için miktar kolonunun ayrı ayrı toplamı bulunur. Bu bilgi urunkodu ile ilişkili ancak faturaNo ile ilişkisizdir.

beyaz_sayfa_en_alt_oval