Ana içeriğe geç
Kesit SQL
Temel · Fonksiyonlar

Koşullu sayım ve oranlar: SUM(CASE WHEN …)

Tek sorguda birden çok koşulu saymak ve oran hesaplamak.

Uygulamada aç, 6 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ç.

Bir sorguda birden çok sayım

“Her kanalda kaç sipariş var, bunların kaçı iptal, iptal oranı ne?” sorusunu tek sorguda yanıtlamak için CASE ifadesini toplama fonksiyonunun içine koyarız. Analist raporlarının belki de en sık kullanılan kalıbı budur.

SELECT channel,
       COUNT(*) AS siparis,
       SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS iptal,
       ROUND(100.0 * SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) / COUNT(*), 1) AS iptal_orani
FROM orders
GROUP BY channel;

Üç eşdeğer yazım

YazımAçıklama
SUM(CASE WHEN koşul THEN 1 ELSE 0 END)Her SQL türünde çalışır. En yaygın yazım.
COUNT(CASE WHEN koşul THEN 1 END)ELSE yazılmayınca NULL döner; COUNT NULL'ları saymaz.
COUNT(*) FILTER (WHERE koşul)Standart SQL. PostgreSQL ve SQLite'ta var; SQL Server, MySQL ve Oracle'da yok.
SELECT channel,
       COUNT(*) FILTER (WHERE status = 'returned') AS iade
FROM orders
GROUP BY channel;

Oran için AVG hilesi

Koşul sağlanınca 1, sağlanmayınca 0 olan bir sütunun ortalaması, koşulun oranıdır. Ondalıklı sonuç için 1.0 kullan:

SELECT segment,
       ROUND(AVG(CASE WHEN city IS NULL THEN 1.0 ELSE 0 END), 3) AS sehirsiz_orani
FROM customers
GROUP BY segment;
Satırları sütuna çevirmekAynı kalıp “pivot” yapmanın taşınabilir yoludur: her durum için bir SUM(CASE…) sütunu yazarsın. Pivot dersinde bunu genişleteceğiz.
Alıştırmalara geç (6)