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.

Laboratuvarı aç →
Ö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.

← Önceki ders · SQL derslerine dön →