Ana içeriğe geç
Kesit SQL
Temel · Özetleme

GROUP BY: gruplara göre özet

Her kategori, şehir veya ay için ayrı özet üretmek.

Uygulamada aç, 11 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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;
Takma adla gruplamaSQLite, MySQL ve PostgreSQL GROUP BY içinde SELECT takma adını kabul eder; SQL Server ve 23ai öncesi Oracle etmez, ifadeyi tekrar yazman gerekir.

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.

Alıştırmalara geç (11)