Ana içeriğe geç
Kesit SQL
Orta · İleri Sorgu Yapıları

ROLLUP, CUBE ve GROUPING SETS: ara toplamlar

Tek sorguda detay, ara toplam ve genel toplam üretmek.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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));
Alıştırmalara geç (5)