“Toplamın yüzde kaçı?”
Raporlarda en çok sorulan sorulardan biri payların dağılımıdır: hangi kategori cironun yüzde kaçını getiriyor? Bunun için her satırda genel toplamı da görmemiz gerekir. Pencere fonksiyonu SUM(...) OVER () tam bunu yapar: satırları gruplamadan tüm sonucun toplamını her satıra yazar.
SELECT p.category,
ROUND(SUM(oi.quantity * oi.unit_price * (1 - oi.discount)), 0) AS ciro,
ROUND(100.0 * SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) / SUM(SUM(oi.quantity * oi.unit_price * (1 - oi.discount))) OVER (), 1) AS pay
FROM order_items oi
JOIN products p ON p.product_id = oi.product_id
GROUP BY p.category
ORDER BY ciro DESC;
SUM(SUM(...)) OVER () ne demek?İçteki SUM, GROUP BY ile her kategorinin cirosunu hesaplar. Dıştaki SUM ... OVER () bu kategori cirolarını toplar. Pencere fonksiyonları GROUP BY'dan sonra çalıştığı için bu iç içe yazım geçerlidir.
Grup içi pay
OVER (PARTITION BY ...) ile toplam, her grubun kendi içinde alınır. Örneğin her şehirde segmentlerin payı:
SELECT city,
segment,
COUNT(*) AS musteri,
ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (PARTITION BY city), 1) AS sehir_ici_pay
FROM customers
WHERE city IN ('İstanbul', 'Ankara')
GROUP BY city, segment
ORDER BY city, segment;
Endeks: baz dönem = 100
Farklı büyüklükteki serileri karşılaştırmak için ilk dönem 100 kabul edilir, diğer dönemler ona oranlanır. FIRST_VALUE ilk dönemin değerini her satıra taşır.