Üç farklı COUNT
SELECT COUNT(*) AS satir, -- tüm satırlar
COUNT(email) AS email_dolu, -- NULL olmayan e-postalar
COUNT(DISTINCT city) AS farkli_sehir -- NULL hariç tekrarsız şehir
FROM customers;
AVG ve NULL
AVG, NULL değerleri yok sayar; paydaya da katmaz. NULL'ları 0 saymak istiyorsan açıkça yaz: AVG(COALESCE(x, 0)). Sonuçlar farklı olabilir ve hangisinin doğru olduğu iş sorusuna bağlıdır.
Tam sayı bölmesi
SQL Server, PostgreSQL ve SQLite'ta iki tam sayının bölümü tam sayıdır: 7 / 2 = 3. Oran hesaplarken bir tarafı ondalığa çevir:
SELECT ROUND(100.0 * SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) / COUNT(*), 1) AS iptal_orani FROM orders;
MySQL, Oracle ve BigQuery'de / her zaman ondalık sonuç verir; ama taşınabilir yazmak için 100.0 * alışkanlığı iyidir.
Boş grupta SUM
Hiç satır yoksa SUM 0 değil NULL döner; COUNT ise 0 döner. Raporlarda COALESCE(SUM(x), 0) yazılır.
SELECT COUNT(*) AS adet, SUM(quantity) AS toplam, COALESCE(SUM(quantity), 0) AS toplam_0 FROM order_items WHERE order_id = -1;
Ortalamaların ortalaması
Kategori ortalamalarının ortalaması, tüm ürünlerin ortalamasına eşit değildir (kategorilerdeki ürün sayıları farklıysa). Doğru ağırlıklı ortalama için ham veriden hesapla.
Derinleş: dört tuzak, dört kontrol
| Tuzak | Kontrol |
|---|---|
| JOIN sonrası SUM şişer | Toplamı birleştirmeden önce ve sonra karşılaştır |
| AVG boşları atlar | COUNT(*) ile COUNT(x) farkına bak |
| Oranların ortalaması | Toplam pay / toplam payda ile karşılaştır |
| COUNT(DISTINCT) ile toplamak | Taneciği (grain) yaz: bir satır neyi temsil ediyor, neyi sayıyorsun? |
SELECT (SELECT SUM(tip) FROM lk_orders) AS dogru_bahsis,
(SELECT SUM(o.tip) FROM lk_orders o JOIN lk_order_lines ol ON ol.order_id = o.order_id) AS sisirilmis;