Ana içeriğe geç
Kesit SQL
Temel · Kanat Havayolları

Uçuşları özetlemek: COUNT, SUM, AVG, GROUP BY ve HAVING

Durumlara, uçak tiplerine ve ücret sınıflarına göre özetler; koşullu sayım ve grup filtresi.

Uygulamada aç, 9 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 havayolunun temel sayıları

Yönetim her sabah birkaç soruya cevap ister: Kaç uçuş yapıldı, kaçı iptal oldu, kaç yolcu taşındı, ortalama bilet fiyatı ne? Bunların hepsi toplama fonksiyonları ve GROUP BY ile yanıtlanır.

SELECT status, COUNT(*) AS ucus, SUM(pax) AS yolcu
FROM hv_flights
GROUP BY status;

COUNT(*) ile COUNT(sütun) farkı burada çok işe yarar

SELECT COUNT(*)          AS planlanan,
       COUNT(actual_dep) AS kalkan,
       COUNT(actual_arr) AS inen
FROM hv_flights;

İptal edilen uçuşun actual_dep değeri, yön değiştiren (diverted) uçuşun actual_arr değeri NULL'dır. COUNT(sütun) NULL'ları saymadığı için üç sayı farklı çıkar.

Koşullu sayım

SELECT tier,
       COUNT(*) AS uye,
       SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) AS epostasiz
FROM hv_passengers
GROUP BY tier;
Ortalama yolcu sayısında iptallerİptal edilen uçuşlarda pax 0'dır. Uçuş başına ortalama yolcu hesaplarken iptalleri dahil edersen ortalama düşer. Ne ölçtüğünü sorudan çıkar ve gerekirse WHERE status <> 'cancelled' ekle.

Derinleş: Operasyon karnesi: iptal oranı ve zamanında kalkış

Bir havayolunun günlük operasyon raporunda iki oran mutlaka bulunur: iptal oranı (iptal ÷ planlanan uçuş) ve zamanında kalkış oranı (OTP, on-time performance). Sektörde yaygın tanım, planlanandan en fazla 15 dakika geç kalkan uçuşu zamanında saymaktır. Varış için de aynı eşik kullanılır.

Payda kimdir?

İptal edilen uçuş hiç kalkmadığı için “zamanında mı?” sorusu ona sorulamaz. OTP'nin paydası kalkan uçuşlardır, yani COUNT(actual_dep). COUNT(*) kullanırsan iptaller “geç kalkmış” gibi sayılır ve oran düşer:

SELECT COUNT(*) AS planlanan,
       COUNT(actual_dep) AS kalkan,
       SUM(CASE WHEN ROUND((julianday(actual_dep) - julianday(sched_dep)) * 1440) <= 15 THEN 1 ELSE 0 END) AS zamaninda,
       ROUND(100.0 * SUM(CASE WHEN ROUND((julianday(actual_dep) - julianday(sched_dep)) * 1440) <= 15 THEN 1 ELSE 0 END)
             / COUNT(actual_dep), 1) AS otp,
       ROUND(100.0 * SUM(CASE WHEN ROUND((julianday(actual_dep) - julianday(sched_dep)) * 1440) <= 15 THEN 1 ELSE 0 END)
             / COUNT(*), 1) AS yanlis_payda
FROM hv_flights;

Doğru OTP %62,1, yanlış paydayla %60,9. Fark küçük görünür ama iptal oranının yükseldiği bir ayda büyür. Daha önemlisi, iptal ve gecikme iki ayrı sorundur ve ayrı raporlanmalıdır. NULL bir actual_dep karşılaştırmada ne doğru ne yanlış (UNKNOWN) sonuç verir; CASE bu yüzden onu 0 sayar ve pay doğru kalır.

Ortalama gecikme yanıltır

Gecikme dağılımı çok çarpıktır: uçuşların çoğu zamanında, birkaçı saatlerce geç kalkar. “Ortalama gecikme 25 dakika” cümlesi, yolcuların çoğunun 25 dakika beklediği izlenimini verir; oysa böyle değildir. Yönetim raporunda oran (OTP), uzun gecikme sayısı (ör. 60+ dk) ve gerekirse medyan birlikte verilir.

MetrikPayPayda
İptal oranıstatus = 'cancelled'Tüm planlanan uçuşlar
Zamanında kalkışKalkış gecikmesi ≤ 15 dkKalkan uçuşlar (actual_dep dolu)
Zamanında varışVarış gecikmesi ≤ 15 dkİnen uçuşlar (actual_arr dolu; diverted hariç)
Uçuş başına yolcuSUM(pax)İptal edilmeyen uçuşlar

Aylık kırılım, tek sayının gizlediği trendi ortaya çıkarır. Kanat'ta OTP Eylül'de %70 civarındayken Aralık'ta %49'a düşüyor. Kış havası, yoğun bayram ve yılbaşı trafiği akla gelen ilk açıklamalardır. Bunu rötar nedenleri tablosuyla doğrulamak bir sonraki adımdır.

Alıştırmalara geç (9)