Ana içeriğe geç
Kesit SQL
Temel · Özetleme

Toplama fonksiyonlarında tuzaklar: COUNT türleri, NULL ve tam sayı bölmesi

COUNT(*) / COUNT(sütun) / COUNT(DISTINCT), AVG ve NULL, oran hesaplarken bölme.

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ç.

Üç 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

TuzakKontrol
JOIN sonrası SUM şişerToplamı birleştirmeden önce ve sonra karşılaştır
AVG boşları atlarCOUNT(*) ile COUNT(x) farkına bak
Oranların ortalamasıToplam pay / toplam payda ile karşılaştır
COUNT(DISTINCT) ile toplamakTaneciğ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;
Alıştırmalara geç (6)