ProgramlamaBackend geliştirici, BI analisti

SQL'de birden fazla filtre ile rapor oluştururken koşullu agregasyon kullanarak güvenilir bir agregasyon nasıl gerçekleştirilir? HAVING, CASE ve agregat fonksiyonlarının bir araya getirilmesi sırasında hangi incelikler vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • WHERE filtresinden bağımsız olarak, tüm gerekli toplamlar tek bir sorguda hesaplanır.
  • SUM içindeki CASE, karmaşık çok göstergeli raporlar oluşturmayı sağlar.
  • HAVING, zaten agregat verilere uygulanır, gruplama sonucunun son filtrasyonu için kullanılır.

Kandırıcı Sorular.

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.

Tipik Hatalar ve Anti-Desenler

  • ELSE yok, CASE NULL döner, toplamlar yanlış.
  • WHERE ve HAVING karıştırılır, yanlış satırlar elde edilir.
  • CASE ile tek bir sorgu yerine birden fazla sorgu kullanılır.

Hayattan Bir Örnek

Negatif Durum

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:

  • Kod kısa.

Eksiler:

  • Hatalı sonuçlar, rapor iş dünyasına yanlış anlatıldı.

Pozitif Durum

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:

  • Doğru, şeffaf göstergeler.
  • Yeni bir durum eklemek kolay.

Eksiler:

  • Sorgular daha uzun hale gelir, filtreler konusunda dikkatli olunmalıdır.