ProgramlamaBackend geliştirici

SQL'de koşullu toplama nasıl gerçekleştirilir (örneğin, bir seçimde ayrı ayrı durumlar için toplamları hesaplamak) ve burada hangi tuzaklar vardır?

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

Cevap.

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:

  • Aynı anda bir sorguda birden fazla koşula göre toplamlaştırma yapmanıza olanak tanır.
  • Tüm SQL lehçelerinde çalışır (sözdizimi desteği tam olarak farklılık gösterebilir).
  • Yalnızca SUM ile değil, COUNT, AVG vb. ile de kullanılabilir.

Tuzağa düşüren sorular.

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.

Yaygın hatalar ve anti-paternlere

  • WHERE kullanmak, CASE içinde iç içe mantık yerine birden fazla tekil sorgu yürütülmesine neden olur, bu da performansı kötüleştirir.
  • CASE içinde ELSE 0 belirlemeyi unutmak, NULL'lar nedeniyle yanlış sayı/toplam elde etmenize neden olabilir.
  • Gerekli kontroller olmadan CASE'in kopyalanması, mantıksal hatalara ve yanlış hesaplamalara yol açar.

Hayattan bir örnek

Olumsuz durum

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:

  • Tek bir metrik için kolay uygulanabilir. Eksiler:
  • Ölçeklendirilebilirlik zorluğu, düşük performans ve kodun tekrarlanabilirliği.

Olumlu durum

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:

  • Yüksek okunabilirlik, ölçeklendirme kolaylığı, performans. Eksiler:
  • CASE sözdizimini ve farklı DBMS'lerdeki inceliklerini bilme gereksinimi.