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ım | Açı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.