80/20 kuralı
Pareto ilkesi: Sonuçların büyük kısmı az sayıda nedenden gelir. Ürünleri ciroya göre sıralayıp kümülatif payı hesaplarsan:
- A sınıfı: Kümülatif payın ilk %80'i (çok değerli, az ürün)
- B sınıfı: %80–95
- C sınıfı: Kalan %5 (uzun kuyruk)
WITH urun AS (
SELECT p.name, SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
FROM order_items oi
JOIN orders o ON o.order_id = oi.order_id
JOIN products p ON p.product_id = oi.product_id
WHERE o.status = 'delivered'
GROUP BY p.product_id, p.name
),
k AS (
SELECT name, ciro,
SUM(ciro) OVER (ORDER BY ciro DESC ROWS UNBOUNDED PRECEDING) / SUM(ciro) OVER () AS kum_pay
FROM urun
)
SELECT name, ROUND(ciro) AS ciro, ROUND(100 * kum_pay, 1) AS kum_yuzde,
CASE WHEN kum_pay <= 0.80 THEN 'A' WHEN kum_pay <= 0.95 THEN 'B' ELSE 'C' END AS sinif
FROM k
ORDER BY ciro DESC;
Derinleş: Kümülatif payın doğru tanımı
Pareto analizinin özü kümülatif paydır: ürünleri ciroya göre büyükten küçüğe sırala, her satırda “buraya kadarki toplam ÷ genel toplam” değerini hesapla. Bu basit tanımın içinde üç karar gizlidir.
1. Sınırı geçen ürün hangi sınıfta?
kum_pay <= 0.80 kuralı, %80 çizgisini geçiren ürünü B sınıfına atar. Oysa o ürün olmadan %80'e ulaşılamaz. Daha savunulabilir tanım, ürünün kendisinden önceki kümülatif paya bakmaktır: önceki pay %80'in altındaysa ürün A'dır.
WITH u AS (
SELECT p.product_id, p.name, SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
FROM order_items oi
JOIN orders o ON o.order_id = oi.order_id
JOIN products p ON p.product_id = oi.product_id
WHERE o.status = 'delivered'
GROUP BY p.product_id, p.name
),
k AS (
SELECT product_id, name, ciro,
SUM(ciro) OVER (ORDER BY ciro DESC, product_id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) / SUM(ciro) OVER () AS kum
FROM u
)
SELECT name, ROUND(ciro) AS ciro,
ROUND(100 * (kum - ciro / (SELECT SUM(ciro) FROM u)), 1) AS onceki_yuzde,
ROUND(100 * kum, 1) AS kum_yuzde
FROM k
WHERE kum BETWEEN 0.74 AND 0.86
ORDER BY ciro DESC, product_id;
Bu sorguda Powerbank 20000mAh satırına bak: öncesi %78,8, kendisiyle %81,1. Çizgiyi geçiren ürün odur. Eski kurala göre B'dir, “önceki pay” kuralına göre A'dır.
2. Eşitlik ve pencere çerçevesi
ORDER BY ciro DESC yazıp çerçeveyi belirtmezsen varsayılan RANGE çerçevesi devreye girer. Aynı ciroya sahip iki ürün aynı kümülatif değeri alır. Sıralamaya ikinci anahtar (product_id) ekleyip ROWS kullanmak sonucu belirli kılar.
3. Hiç satmayan ürünler
INNER JOIN, hiç satılmamış ürünleri listeden sessizce düşürür. Anadolu Market'in 40 ürününden 2'si (Koşu Bandı ve Gurme Lokum Kutusu) hiç teslim edilmemiş. “Ürünlerin yüzde kaçı cironun %80'ini yapıyor?” sorusunda payda 38 değil 40 olmalıdır. Bu ürünler C sınıfının en dibine LEFT JOIN ile eklenir.