Raporlarda ara toplam
“Kategori ve kanal bazında satış, her kategorinin ara toplamı ve genel toplam” gibi raporlar için birden çok GROUP BY'ı UNION ile birleştirmek yerine gruplama kümeleri kullanılır. SQL Server, PostgreSQL, Oracle ve MySQL (WITH ROLLUP) destekler; SQLite desteklemez (SQLite sekmesinde UNION ALL karşılığını görebilirsin).
SELECT p.category, o.channel, COUNT(*) AS satis_satiri
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 p.category IN ('Kitap', 'Spor')
GROUP BY ROLLUP (p.category, o.channel)
ORDER BY p.category, o.channel;
Sonuçta channel değeri NULL olan satırlar o kategorinin ara toplamı, iki sütunun da NULL olduğu satır genel toplamdır.
| Yazım | Üretilen gruplar (a, b için) |
|---|---|
ROLLUP (a, b) | (a, b), (a), () — hiyerarşik ara toplamlar |
CUBE (a, b) | (a, b), (a), (b), () — tüm kombinasyonlar |
GROUPING SETS ((a), (b)) | Yalnızca (a) ve (b) — istediğin kümeler |
GROUPING() ile toplam satırını etiketlemek
Gerçek NULL değerle “toplam” NULL'ını ayırmak için GROUPING(sütun) kullanılır: o satırda sütun toplanmışsa 1 döner.
SELECT CASE WHEN GROUPING(c.segment) = 1 THEN N'TOPLAM' ELSE c.segment END AS segment,
COUNT(*) AS siparis
FROM orders o
JOIN customers c ON c.customer_id = o.customer_id
GROUP BY ROLLUP (c.segment);
GROUPING SETS
SELECT c.segment, o.channel, COUNT(*) AS siparis FROM orders o JOIN customers c ON c.customer_id = o.customer_id GROUP BY GROUPING SETS ((c.segment), (o.channel));