Koşullu agregasyon, raporlamada klasik bir sorundur. İlk başlarda, farklı ölçüleri hesaplamak için ayrı sorgular oluşturuluyordu. Kısa sürede daha kompakt bir çözüm bulundu — agregat fonksiyonları içinde CASE kullanarak koşullu agregasyon (örneğin, SUM(CASE WHEN ...)). Sorun, filtrelerin, gruplamanın ve toplam başlıkların birleşiminde ortaya çıkar: yanlış toplamlar elde etmek ya da sonucu yanlış yorumlamak kolaydır.
Çözüm: Agregat fonksiyonları içerisinde koşullu agregasyon kullanmak. Örneğin, tüm çalışanlar için "işlemde" ve "tamamlanan" siparişlerin sayısını çıkarmak gerekir:
SELECT employee_id, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing_count, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) as done_count FROM Orders GROUP BY employee_id;
Anahtar özellikler:
CASE koşulu NULL yerine 0 dönerse ne olur?
Agregat fonksiyonu SUM, NULL değerleri göz ardı eder. Bu nedenle, CASE WHEN ... THEN 1 END yazılırsa, atlanan satırlar dikkate alınmaz. Her zaman açıkça ELSE 0 yazmak daha iyidir.
SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END)
WHERE filtresi koşullu agregasyon ile durumların toplamını değiştirebilir mi?
Evet: eğer ana WHERE limitli seçim yapıyorsa (örneğin, WHERE region = 'west'), hesaplamalar yalnızca filtrelenmiş veriler üzerinden yapılacaktır. Genel toplamlar için alt sorgu kullanın veya filtreyi kaldırın.
HAVING, gruplamadan önce satır filtresi olarak kullanılabilir mi?
Hayır. HAVING, zaten gruplandırılmış verileri agregatlar üzerinden filtreler. Temel satır filtreleme — WHERE üzerinden yapılır.
Analitik raporda kullanıldı:
SUM(CASE WHEN status = 'approved' THEN 1 END)
Birçok NULL vardı, toplamlar eksik çıktı. WHERE filtresi nedeniyle bazı gerekli satırlar kayboldu.
Artılar:
Eksiler:
Kullanıldı:
SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END)
Kod tek bir sorguda sürdürüldü, toplamlar üstüne filtreler HAVING üzerinden yapıldı.
Artılar:
Eksiler: