Koşullu toplama değere (örneğin toplam veya miktar) göre farklı koşullar altında bir sorgu içinde toplamak gerektiğinde kullanılır. Tarihsel olarak, SQL geliştiricileri bu tür bir amaca ulaşmak için birden fazla alt sorgu yazmak ya da her bir kategori için ayrı ayrı birleştirme ve gruplama yapmak zorundaydı, bu da kodun daha az okunabilir ve daha az verimli olmasına yol açıyordu.
Sorun, farklı koşullar altında birden fazla toplamı aynı anda hesaplamanın zorluğuydu — her bir toplam genellikle filtreleme gerektirdiğinden, SUM() veya COUNT() uygulaması, toplam fonksiyonu içinde gerekli koşulu göz önünde bulundurmuyordu.
Çözüm — toplam fonksiyonu içinde CASE yapısını kullanmak, farklı koşullara göre toplamları "ayırmaya" olanak tanır, çoklu birleştirme yapmadan:
Kod örneği:
SELECT department, SUM(CASE WHEN status = 'approved' THEN amount ELSE 0 END) AS approved_sum, SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS pending_sum, COUNT(CASE WHEN status = 'rejected' THEN 1 END) AS rejected_count FROM payments GROUP BY department;
Anahtar özellikler:
Koşullu toplama için CASE yapısı olmadan idare edilebilir mi?
Yanlış cevap — doğrudan sorguda WHERE kullanmaktır. Aslında, WHERE, toplama öncesi satırları filtreler, her bir toplam sütunu içinde değil.
Kod örneği (yanlış yol):
SELECT COUNT(*) FROM payments WHERE status = 'approved'; SELECT COUNT(*) FROM payments WHERE status = 'pending';
Bu sorgular, CASE olmadan farklı koşullar altında tek bir sonuç satırı olarak birleştirilemez.
Koşullu ifadenin içinde NULL kullanılırsa ne olur?
Eğer CASE alternatif bir değer döndürmüyorsa, varsayılan olarak NULL olur ve toplam fonksiyonu NULL'ları göz ardı eder.
Kod örneği:
SUM(CASE WHEN status = 'approved' THEN amount END) -- Eğer durum 'approved' değilse, NULL olur ve satır SUM'da göz ardı edilir.
CASE yerine IF kullanabilir miyim?
Bazı SQL lehçelerinde (örneğin, MySQL) bu mümkündür, ancak bu tür kod, farklı veritabanları arasında taşınabilirliği zorlaştırır. Evrensel sorgularda her zaman CASE kullanmalısınız.
Analist, birkaç ayrı alt sorgu yazarak her durum için toplamları hesaplamaya çalıştı. Dış rapor karmaşık hale geldi ve yeni durumlar eklemek, her seferinde kodun yeniden yazılmasını gerektirdi.
Artılar:
Geliştirici, tek bir genel sorguda CASE kullanarak yeni durumlar eklemek için kolay düzenleme imkanı sunan evrensel bir rapor oluşturdu.
Artılar: