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.
delivered) siparişler sayılır. 2024 = order_date 2024-01-01 ile 2024-12-31 arası.Kurul hangi sorulara yanıt arıyor?
- Yılı nasıl kapattık? (ciro, sipariş, ortalama sepet)
- Ciro aylara nasıl dağıldı?
- Hangi ürünler öne çıktı?
- Satış kanallarının payı ne?
- Kaç yeni müşteri kazandık ve ne kadar harcadılar?
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
- Hangi tarih? Sipariş tarihi mi, teslim tarihi mi? Aralık sonunda verilip Ocak'ta teslim edilen sipariş hangi yıla yazılır? Bu vakada sipariş tarihi esas.
- Hangi durum? Yalnızca teslim edilenler; iade ve iptaller ciroya girmez.
- Hangi tutar? İndirim sonrası net tutar; KDV ve kargo yok.
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.
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?