MS SQL Eğitimlerimize hesaplama fonksiyonlarından sonra bu hesaplama fonksiyonlarını daha anlamlı kılan Group By deyimiyle devam ediyoruz.

Olayı şöyle anlamaya çalışalım. Bir veri tabanında bir kolonda aynı tür veriden birden fazla olabilir. Örneğin kişilerin ülkelerinin girildiği Facebook da kullanılan bir tablo düşünelim. Sadece var olan ülkeleri görmek istiyoruz. İşte böyle bir durumda gruplama yöntemini kullanırız. 100 tane Türkiye olsa 50 tane Fransa olsa bize bunları Türkiye ve Fransa olarak iki ülkenin bu veri tabanında olduğunu anlatacak şekilde gruplar.

Kullanımı

SELECT KOLON_ADI FROM TABLO_ADI GROUP BY KOLON_ADI

Tek tek örneklerle pek çok Group By kullanımını öğreneceğiz.

XENONBOX veritabanı üzerinde işlemlerimizi yapıyor olacağız.

Step 1

PRODUCT tablosunu SUPPLIERID kolonuna göre gruplayalım.

SELECT SUPPLIERID FROM PRODUCT GROUP BY SUPPLIERID
1
2
3
4
5
6
7
8
9
11

Step 2

Gruplama işlemi yaparken tüm kolonları listeleyerek gruplama işlemi yapamazsınız. Daha önceki SQL sürümlerinde yapılabiliyordu ama anlamsız bir gruplama sonucu ortaya çıkıyordu. 2017 ile bu durumu tamamen kaldırdılar. Artık gruplayamıyorsunuz.

Bir örnek ile hatamızı görelim.

SELECT * FROM PRODUCT GROUP BY SUPPLIERID
Column 'PRODUCT.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

 

Step 3

Tedarikçi gruplarının toplam maliyetlerine göre bir grup oluşturalım.

SELECT SUPPLIERID, SUM(UNITPRICE) FROM PRODUCT GROUP BY SUPPLIERID

SELECT SUPPLIERID, SUM(UNITPRICE) AS [TOPLAM BİRİM FİYAT] FROM PRODUCT GROUP BY SUPPLIERID
1 4700.00
2 6035.00
3 9500.00
4 13800.00
5 5900.00
6 4475.00
7 17785.00
8 9100.00
9 3000.00
11 8913.00

 

Burada gerçekleşen işlemi anlatalım. Kolon olarak SUPPLIERID ve UNITPRICE ‘ın olacağını ve UNITPRICE toplamını da SUPPLIER grubuna göre yapar. Çünkü Group By içinde kullandığımız değer SUPPLIERID kolonu.Bu işlemi yaptı ve gruplama sıralamasını bize verdi. Şunu anlıyoruz. 1 ID numarasına sahip tedarikçiye ürünleri için toplam 4700 birim fiyat para ödememiz gerekiyor.

Step 4

Şimdi şunu sorgulayalım. Hangi tedarikçiye kaç sipariş vermişiz. yani her bir tedarikçi grubunun kaç adet olduğunu öğreneceğiz.

SELECT SUPPLIERID, COUNT(*) AS [Temin Edilen Ürün Sayısı] FROM PRODUCT GROUP BY SUPPLIERID
1 3
2 3
3 3
4 3
5 2
6 3
7 5
8 2
9 2
11 3

 

Step 5

Group By kullanımını birden fazla kolon ismi ile yapabilirsiniz.

Tedarikçileri temin ettikleri ürün isimleri ile beraber bir gruplayım.

SELECT SUPPLIERID,PRODUCTNAME, COUNT(*) AS [Temin Edilen Ürün Sayısı] FROM PRODUCT GROUP BY PRODUCTNAME,SUPPLIERID
1 Aniseed Syrup 1
1 Chai 1
1 Chang 1
2 Chef Anton’s Cajun Seasoning 1
2 Chef Anton’s Gumbo Mix 1
2 Louisiana Hot Spiced Okra 1
3 Grandma’s Boysenberry Spread 1
3 Northwoods Cranberry Sauce 1
3 Uncle Bob’s Organic Dried Pears 1
4 Ikura 1

 

Burada gerçekleşen işlem şudur. Gruplama işlemi sıra ile gerçekleştirilir. Önce PRODUCTNAME e göre yapıldı daha sonra o sıralama SUPPLIERID değerine göre kendi arasında bir daha gruplandı. 

Bunu net olarak anlamak içi yerlerini değiştirelim.

Önce SUPPLIERID ye göre yaptı ve sonra PRODUCTNAME’e göre yaptı ve alfabetik bir sıralama gerçekleştirdi. 

Group By ile Where Kullanımı

Gruplama işlemi yaparken de istediğimiz şartlara göre yaptırabiliriz.

Örneğin UNITPRICE değeri 10 000 den büyük olanları listeleyelim ve gruplayalım.

SELECT SUPPLIERID,PRODUCTNAME, SUM(UNITPRICE) AS [Toplam Birim Fiyat] FROM PRODUCT WHERE UNITPRICE>10000 GROUP BY SUPPLIERID,PRODUCTNAME
18 Côte de Blaye 26350.00
12 Thüringer Rostbratwurst 12379.00

 

 

Burada olan olayı anlatmak gerekirse. Öncelikle UNITPRICE  değeri 10 000 den büyük olanlar listelendi. Sonra bu değerler toplandı ve en sonunda şarta göre gruplama yapıldı.

Ama biz gruplama işlemi olduktan sonra değerin karşılaştırılmasını ve verilerin ona göre gelmesini isteseydik ne yapacaktık. O zamanda Having kavramı devreye girecek bir sonraki yazımızın konusu. 

Böyle bir durumda bulunmasını istediğimiz kolonları yazdığımız yerde Group By içine almadığımız ve herhangi bir hesaplama işlemine dahil olmamış kolon var ise bu sorgu hata verecektir. Bulunan kolonların hepsinin Group By içindede olması gerekir. Yada bir hesaplama işlemine dahil olması gerekir.

Group By kullanımı da böyleydi. Bir sonraki yazımda görüşmek üzere.

 


muratbilginer