SQL · DERS 06
Mini Proje · Satış Raporu
Her müşteri için brüt satış, pozitif iade toplamı ve net satış hesapla. Net satış, brüt satıştan iade toplamının çıkarılmasıyla bulunur.
1. Bir satır neyi temsil ediyor?
sales_orders tablosunda her satır bir sipariş. refunds tablosunda her satır bir iade işlemi. A1 siparişi 120 TL ve iki iadesi var: 20 ve 10 TL. Aynı müşterinin A2 siparişi de 120 TL ve iadesi yok. C2’nin tek siparişi 80 TL, onun da iadesi yok.
2. Hatalı raporu incele
SELECT o.customer_id,
SUM(o.amount) AS gross,
SUM(COALESCE(r.amount, 0)) AS refunds,
SUM(o.amount - COALESCE(r.amount, 0)) AS net
FROM sales_orders AS o
LEFT JOIN refunds AS r ON r.order_id = o.order_id
GROUP BY o.customer_id;C1 için brüt satış neden 240 TL yerine 360 TL çıkıyor?
İpucu al
A1, iki iadeyle eşleşince birleştirme sonucunda kaç kez görünür?
3. Laboratuvarda düzelt
İadeleri önce sipariş kimliğine göre topla. Ardından her siparişi en fazla bir iade toplamıyla eşleştir. İadesi olmayan siparişlerde COALESCE ile sıfır kullan.
Örnek çözüm
WITH refund_totals AS (
SELECT order_id, SUM(amount) AS amount
FROM refunds
GROUP BY order_id
)
SELECT o.customer_id,
SUM(o.amount) AS gross,
SUM(COALESCE(r.amount, 0)) AS refunds,
SUM(o.amount - COALESCE(r.amount, 0)) AS net
FROM sales_orders AS o
LEFT JOIN refund_totals AS r ON r.order_id = o.order_id
GROUP BY o.customer_id;C1: 240 TL brüt, 30 TL iade, 210 TL net. C2: 80 TL brüt, 0 TL iade, 80 TL net.
Junior veri analisti mülakat sorusu
Brüt satışın şişmesini SUM(DISTINCT o.amount) ile düzeltmek neden güvenilir değil?
Örnek yanıt
Farklı siparişlerin tutarı aynı olabilir. A1 ve A2 ayrı siparişler olmasına rağmen ikisi de 120 TL. DISTINCT tutarı bir kez sayar. Önce her siparişin bir kez göründüğü birleştirmeyi kurarım, sonra müşteri düzeyinde toplarım.