Anadolu Market'in satış verisi
Dört tablo birlikte: customers, orders, order_items, products. Sorular gerçek iş sorularına benziyor. Net tutar her yerde adet × birim fiyat × (1 − indirim).
Nasıl çalışmalı?
- Soruyu oku ve sonuçta hangi sütunların, kaç satırın bekleneceğini tahmin et.
- Önce
SELECT *ile ilgili satırlara bak; sonra sütunları ve koşulları ekle. - Kontrol et'e basmadan önce Sadece çalıştır ile sonucu incele.
- İki denemede çözemezsen ipucuna bak; çözümü görmek XP'yi azaltır ama soruyu Tekrar listesine ekler.
Bu kampta en çok kullanacağın kalıplar
| İhtiyaç | Kalıp |
|---|---|
| Net tutar | SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) |
| Teslim edilenler | WHERE o.status = 'delivered' |
| Hiç satılmamış | LEFT JOIN order_items oi ... WHERE oi.product_id IS NULL |
| Sipariş sayısı şişmesin | COUNT(DISTINCT o.order_id) |
| Müşterinin ilk siparişi | ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date, order_id) |
| Önceki ay | LAG(ciro) OVER (ORDER BY ay) |
Tablolar
customers, orders, order_items, products. Sipariş satırları order_items'tadır; ciro her zaman satır düzeyinde hesaplanıp toplanır. Sütunların açıklamaları ve örnek satırlar Veri setleri sayfasında.Derinleş: dört tabloyla güvenli çalışmak
Brif: Kategori müdürü“Gelecek yılın bütçesini kategorilere ve segmentlere dağıtacağız. Hangi kategori ciro getiriyor, hangi müşteri grubu daha değerli? Sayılarının doğru olduğundan emin olmak istiyorum; bütçe buna göre bölünecek.”
Çalışma planı
- Tanecikliği belirle.
orders'ta bir satır bir sipariş,order_items'ta bir satır bir sipariş kalemidir. JOIN'den sonra satır sayısı kalem sayısına çıkar. Aşağıdaki sorgu bunu gösterir: teslim edilen 712 sipariş, birleşince 1.269 satır olur. - Ölçüyü doğru düzeyde hesapla. Ciro kalem düzeyinde toplanır; sipariş sayısı
COUNT(DISTINCT o.order_id)ile sayılır; müşteri başı ciro için önce müşteri düzeyine toplanır. - Durumu sabitle. Ciro = yalnızca
delivered. Sipariş sayısında iptaller dahil mi? Soruda yazmıyorsa varsayımını not et.
SELECT COUNT(*) AS satir, COUNT(DISTINCT o.order_id) AS siparis FROM orders o JOIN order_items oi ON oi.order_id = o.order_id WHERE o.status = 'delivered';
Kontrol listesi
- Mutabakat. Kategori cirolarının toplamı, kategorisiz hesaplanan toplam teslim cirosuna eşit olmalı. Eşit değilse ürünü eşleşmeyen satır var demektir.
- Satır sayısı. Her JOIN'den sonra
COUNT(*)ileCOUNT(DISTINCT anahtar)karşılaştır. Beklenmeyen artış = çoğalma. - Kayıp satırlar. INNER JOIN, hiç siparişi olmayan 14 müşteriyi sessizce düşürür. “Müşterilerin yüzde kaçı” gibi sorularda LEFT JOIN gerekir.
- Uç değer. İndirim 0 ile 0,2 arasında, adet 1–3. Bunların dışında bir değer görürsen veri hatasıdır.
Teslim
Yönetici özeti örneği2024'te teslim edilen net ciro 636.316 TL. Sipariş başına sepet segmentler arasında birbirine yakın (1.364–1.625 TL), ama müşteri başına ciro Premium'da 10.833 TL, Bireysel'de 3.028 TL. Fark sepet büyüklüğünden değil alışveriş sıklığından geliyor; bütçe sadakat ve tekrar satın alma programlarına kaydırılmalı.
Kendini değerlendir
| Ölçüt | Başlangıç | İyi | Mükemmel |
|---|---|---|---|
| Doğruluk | Sorgular çalışıyor | Ciro satır düzeyinde, DISTINCT doğru yerde | Her sonuç bir mutabakatla doğrulanmış |
| JOIN seçimi | Hep INNER JOIN | LEFT JOIN gerektiğinde fark ediliyor | Kaybolan ve çoğalan satırlar sayıyla gösteriliyor |
| Yorum | Tablo | Tabloya bir cümle | Ölçüler arasındaki farkın nedeni açıklanmış |