Ana içeriğe geç
Kesit SQL
Orta · Vaka Çalışmaları

Vaka: Anadolu Market 2024 yıl sonu raporu

Yönetim kurulu sunumu için beş adımda baştan sona bir analiz.

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

Durum

Anadolu Market'in genel müdürü, yönetim kurulu toplantısı için 2024 yılının özetini istiyor. Senden beş sorunun yanıtını tek tek SQL ile çıkarmanı bekliyor. Her adım bir alıştırma; sırayla ilerle.

Ortak tanımlarNet ciro = adet × birim fiyat × (1 − indirim). Yalnızca teslim edilen (delivered) siparişler sayılır. 2024 = order_date 2024-01-01 ile 2024-12-31 arası.

Kurul hangi sorulara yanıt arıyor?

  1. Yılı nasıl kapattık? (ciro, sipariş, ortalama sepet)
  2. Ciro aylara nasıl dağıldı?
  3. Hangi ürünler öne çıktı?
  4. Satış kanallarının payı ne?
  5. Kaç yeni müşteri kazandık ve ne kadar harcadılar?
Analist alışkanlığıHer sorgunun sonucunu bir sonraki adıma geçmeden önce sağlama yap: aylık ciroların toplamı yıllık ciroya eşit mi? Kanal paylarının toplamı %100 mü?

Derinleş: raporu kurula sunmadan önce

Yönetim kuruluna giden bir sayının yanlış çıkması, analizin geri kalanına olan güveni de yok eder. Bu yüzden deneyimli analist, rapor sorgularını yazdıktan sonra üç iş daha yapar: tanımları sabitler, sağlama yapar ve karşılaştırma bağlamı ekler.

1. Tanımları sabitle

2. Sağlama

Aylık ciroların toplamı yıllık ciroya eşit olmalı. Eşit değilse ya ay dışında kalan kayıtlar var ya da bir JOIN satırları çoğaltıyor:

WITH t AS (
  SELECT strftime('%m', o.order_date) AS ay,
         oi.quantity * oi.unit_price * (1 - oi.discount) AS tutar
  FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
  WHERE o.status = 'delivered' AND o.order_date >= '2024-01-01' AND o.order_date < '2025-01-01'
),
aylik AS (SELECT ay, SUM(tutar) AS ciro FROM t GROUP BY ay)
SELECT (SELECT ROUND(SUM(tutar)) FROM t) AS yillik,
       (SELECT ROUND(SUM(ciro)) FROM aylik) AS aylik_toplam,
       (SELECT COUNT(*) FROM aylik) AS ay_sayisi;

3. Karşılaştırma bağlamı

“2024 cirosu 636 bin TL” tek başına iyi mi kötü mü söylemez. Bir önceki yılla ay ay yan yana koymak kurulun ilk soracağı soruyu baştan yanıtlar:

WITH a AS (
  SELECT strftime('%m', o.order_date) AS ay, strftime('%Y', o.order_date) AS yil,
         oi.quantity * oi.unit_price * (1 - oi.discount) AS tutar
  FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
  WHERE o.status = 'delivered' AND o.order_date >= '2023-01-01' AND o.order_date < '2025-01-01'
)
SELECT ay,
       ROUND(SUM(CASE WHEN yil = '2023' THEN tutar ELSE 0 END)) AS y2023,
       ROUND(SUM(CASE WHEN yil = '2024' THEN tutar ELSE 0 END)) AS y2024
FROM a
GROUP BY ay
ORDER BY ay;

Net ciro 2023'te 335.573 TL, 2024'te 636.316 TL: yaklaşık %89,6 büyüme. Büyümenin müşteri sayısından mı, sepet tutarından mı geldiğini ayırmak bir sonraki doğal sorudur.

Kârlılıkta tarihçe tuzağıBrüt kârı products.cost ile hesaplarsan bugünkü maliyeti geçmiş satışlara uygularsın. Maliyet zamanla değiştiyse doğru yöntem, maliyetin de bir SCD 2 tablosunda tutulup satış anındaki değerle birleştirilmesidir. Raporda bu varsayımı açıkça yaz.

Sunum kontrol listesi: her sayının tanımı dipnotta mı, toplamlar sağlandı mı, yüzdeler %100 ediyor mu, önceki dönemle karşılaştırma var mı, tek seferlik etkiler (büyük kurumsal sipariş, kampanya) not edildi mi?

Alıştırmalara geç (7)