Her grup için bir satır
“Kategori başına kaç ürün var?” sorusu için GROUP BY kullanılır. Aynı değere sahip satırlar bir grup olur ve toplama fonksiyonu her grup için ayrı hesaplanır.
SELECT category, COUNT(*) AS urun_sayisi FROM products GROUP BY category;
Altın kural
SELECT listesindeki her sütun ya GROUP BY'da yer almalı ya da bir toplama fonksiyonunun içinde olmalıdır.
-- Hatalı: name gruplanmamış SELECT category, name, COUNT(*) FROM products GROUP BY category;
PostgreSQL, SQL Server, MySQL, Oracle ve BigQuery bu sorguyu reddeder; bu uygulamada da o türleri seçince aynı hatayı alırsın. Yalnız SQLite çalıştırır ve rastgele bir name döndürür. Doğru alışkanlık: kuralı her zaman uygula.
Birden fazla sütunla gruplama
SELECT status, channel, COUNT(*) AS adet FROM orders GROUP BY status, channel ORDER BY status, adet DESC;
Hesaplanmış ifadelere göre gruplama
SELECT substr(order_date, 1, 4) AS yil, COUNT(*) AS siparis FROM orders GROUP BY yil ORDER BY yil;
Derinleş: gruplamayı adım adım düşün
GROUP BY yazmadan önce şu soruyu sor: sonuçta bir satır neyi temsil edecek? “Her şehir” mi, “her şehir ve ay” mı? Sonra SELECT'e yalnızca bu taneciği tanımlayan sütunlar ve toplama fonksiyonları girer.
SELECT r.city,
strftime('%Y-%m', o.placed_at) AS ay,
COUNT(*) AS siparis
FROM lk_orders o
JOIN lk_restaurants r ON r.restaurant_id = o.restaurant_id
GROUP BY r.city, strftime('%Y-%m', o.placed_at)
ORDER BY r.city, ay;
Gruplama NULL değerleri tek bir grup olarak toplar; bu grup sonuçta boş bir satır olarak görünür.