TOP

SQL Dersi 8. Veri gruplaması (GROUP BY)

Veri gruplama, tüm verileri mantıksal kümelere ayırmanıza olanak tanır ve bu, istatistiksel hesaplamaların her grupta ayrı ayrı yapılmasını mümkün kılar.


1. Grup oluşturma (GROUP BY)

Gruplar, SELECT operatörünün GROUP BY ifadesi kullanılarak oluşturulur. Bir örnek düşünelim.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

Bu taleple birlikte her ay satılan ürün adetlerine ilişkin bilgileri çıkardık. SELECT operatörü iki sütunun çıktısını almayı emreder Ürün - ürünün adı ve Ürün_num - satılan ürünlerin miktarını görüntülemek için oluşturduğumuz hesaplanan alan (alan formülü SUM(Quantity)). GROUP BY cümlesi, DBMS'ye verileri Ürün sütununa göre gruplandırmasını söyler.

Ayrıca GROUP BY'nin WHERE yan tümcesinden sonra ve ORDER BY'den önce gelmesi gerektiğini de belirtmek gerekir.

2. Grupları filtreleme (HAVING)

Bir tablodaki satırları filtrelediğimiz gibi, gruplandırılmış verileri de filtreleyebiliriz. Bunun için SQL'de HAVING operatörü bulunmaktadır. Önceki örneği ele alalım ve grup filtrelemeyi ekleyelim.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Her ürün için satılan ürün sayısı hesaplandıktan sonra DBMS'nin 4.000 adetten az satılan ürünleri "kestiğini" görüyoruz.

Gördüğünüz gibi HAVING operatörü, WHERE operatörüne çok benziyor ancak aralarında önemli bir fark var: WHERE verileri gruplandırılmadan önce, HAVING ise gruplandırıldıktan sonra filtreliyor. Böylece WHERE cümlesi ile kaldırılan satırlar gruba dahil edilmeyecektir. Yani WHERE ve HAVING operatörleri aynı cümlede kullanılabilir. Bir örnek düşünün:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

"Kayaklar Uzun" ürününü belirttiğimiz önceki örneğe WHERE operatörünü ekledik ve bu da HAVING operatörüne göre gruplamayı etkiledi. Sonuç olarak "Skis Long" ürününün 4.000'den fazla satılan ürün grupları listesine giremediğini görüyoruz.

3. Gruplama ve sıralama

Normal veri örneklemede olduğu gibi HAVING operatörü ile gruplandırdıktan sonra grupları sıralayabiliriz. Bunun için zaten tanıdık olan ORDER BY operatörünü kullanabiliriz. Bu durumda uygulaması önceki örneklere benzer. Örnek:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

veya alan numarasını sıralamak istediğimiz sıraya göre belirtmeniz yeterlidir:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

Özet sonuçları sıralamak için HAVING operatöründen sonra ORDER BY ile cümle yazmamız gerektiğini görüyoruz.

MS Access grupları sütun takma adlarına göre sıralamayı desteklemiyor yani örneğimizde değerleri sıralamak için sorgu sonuna ORDER BY Product_num yazamayacağız.