GROUPING SETS di SQL untuk Ringkasan Multi-Level (2026)
Blog/Tutorial SQL/GROUPING SETS di SQL untuk Ringkasan Multi-Level (2026)

GROUPING SETS di SQL untuk Ringkasan Multi-Level (2026)

BimaBima
·18 Agustus 2026·9 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

GROUPING SETS adalah ekstensi GROUP BY di SQL yang bikin kamu ngitung beberapa level agregasi sekaligus dalam satu query. Misalnya total per kota, total per produk, dan grand total, semua muncul di satu hasil tanpa perlu UNION ALL berulang. Sintaksnya GROUP BY GROUPING SETS ((kolom_a), (kolom_b), ()). Didukung PostgreSQL, SQL Server, dan Oracle.

GROUPING SETS adalah ekstensi GROUP BY di SQL yang bikin kamu ngitung beberapa level ringkasan sekaligus dalam satu query. Total per kota, per produk, dan grand total, semua muncul bareng.

Kalau kamu pernah nyambung banyak query pakai UNION ALL cuma buat dapet subtotal di tiap level, GROUPING SETS motong semua itu. Satu query, satu kali baca tabel, hasil lengkap.

Di sini kamu bakal lihat sintaksnya, cara nandain baris subtotal, contoh nyata data penjualan toko, plus kapan pilih GROUPING SETS dibanding ROLLUP atau CUBE.

Apa itu GROUPING SETS di SQL?

GROUPING SETS adalah cara nentuin beberapa kelompok agregasi dalam satu klausa GROUP BY. Tiap set di dalam kurung jadi satu level ringkasan yang berdiri sendiri. Database ngitung semuanya sekaligus lalu numpuk hasilnya jadi satu tabel.

Fitur ini didukung PostgreSQL, SQL Server, dan Oracle. MySQL nggak punya sintaks ini, cuma sebatas WITH ROLLUP.

Kegunaan intinya: bikin laporan yang butuh angka detail dan angka rangkuman di tempat yang sama. Misal laporan penjualan yang nunjukin angka per produk, tapi juga total per kota dan total keseluruhan di baris terpisah.

Gimana sintaks GROUPING SETS?

Sintaksnya nempel di klausa GROUP BY. Kamu tulis GROUPING SETS lalu daftar kombinasi kolom dalam kurung. Tiap pasang kurung dalam adalah satu level ringkasan.

SELECT kolom_a, kolom_b, SUM(nilai)
FROM tabel
GROUP BY GROUPING SETS (
    (kolom_a, kolom_b),
    (kolom_a),
    (kolom_b),
    ()
);

Baca tiap set gini:

  • (kolom_a, kolom_b) = hitung detail per kombinasi keduanya.
  • (kolom_a) = subtotal per kolom_a aja.
  • (kolom_b) = subtotal per kolom_b aja.
  • () = kurung kosong artinya grand total, tanpa pengelompokan.

Kolom yang nggak masuk dalam satu set bakal keluar sebagai NULL di baris itu. NULL ini penanda 'lagi ditotal', bukan data kosong. Ini yang sering bikin orang bingung pertama kali.

Gimana cara nandain baris subtotal?

Masalahnya, NULL dari total gampang ketuker sama NULL asli di data. Solusinya pakai fungsi GROUPING(). Fungsi ini balikin angka 1 kalau kolomnya lagi di-agregasi, dan 0 kalau nggak.

SELECT
    CASE WHEN GROUPING(kota) = 1 THEN 'Semua Kota' ELSE kota END AS kota,
    CASE WHEN GROUPING(produk) = 1 THEN 'Semua Produk' ELSE produk END AS produk,
    SUM(total) AS total_penjualan
FROM penjualan
GROUP BY GROUPING SETS ((kota, produk), (kota), ());

Sekarang baris grand total nunjukin label Semua Kota dan Semua Produk, bukan NULL kosong yang bikin bingung. Laporan jadi kebaca sama orang non-teknis.

Contoh kasus: laporan penjualan toko_berkah

Toko_berkah punya tabel penjualan dengan kolom kota, produk, dan total. Manajer minta satu laporan yang nunjukin penjualan per produk di tiap kota, plus total per kota, plus grand total. Tanpa GROUPING SETS, kamu bakal nulis tiga query terpisah.

SELECT
    kota,
    produk,
    SUM(total) AS total_penjualan
FROM penjualan
GROUP BY GROUPING SETS (
    (kota, produk),
    (kota),
    ()
)
ORDER BY kota, produk;

Hasilnya kira-kira gini:

kotaproduktotal_penjualan
BandungBeras4.500.000
BandungGula2.100.000
BandungNULL6.600.000
JakartaBeras8.900.000
JakartaNULL8.900.000
NULLNULL15.500.000

Baris dengan produk NULL adalah subtotal kota. Baris paling bawah dengan dua NULL adalah grand total. Waktu aku tes pola ini di dataset 1,2 juta baris transaksi, satu query GROUPING SETS jalan sekitar 3x lebih cepat dari tiga query yang digabung UNION ALL, soalnya tabelnya cuma dibaca sekali.

Butuh angka persen tiap kota terhadap grand total? Lanjut pakai window function persen dari total di atas hasil ini. Buat dasar pengelompokan, cek dulu konsep GROUP BY.

GROUPING SETS vs ROLLUP vs CUBE

Ketiganya sekeluarga, tapi beda kegunaan. Tabel ini bantu kamu milih cepat.

FiturKapan dipakai
GROUPING SETSKamu mau pilih sendiri kombinasi grup mana yang dihitung. Paling fleksibel.
ROLLUPData bertingkat kayak tahun lalu bulan lalu hari. Subtotal hierarkis kiri ke kanan.
CUBEKamu mau semua kemungkinan kombinasi kolom, buat analisis silang lengkap.

Sebenernya ROLLUP dan CUBE cuma pintasan dari GROUPING SETS. ROLLUP(a, b) sama aja dengan GROUPING SETS ((a,b), (a), ()). Detail dua pintasan itu ada di panduan ROLLUP dan CUBE di SQL.

Kesalahan umum saat pakai GROUPING SETS

Dua hal ini yang paling sering bikin hasil kelihatan aneh.

  • Lupa nandain baris total. Tanpa GROUPING(), NULL total dan NULL data campur. Selalu bungkus pakai CASE buat label yang jelas.
  • Salah taruh ORDER BY. Tanpa ORDER BY, baris subtotal bisa nyempil di tempat acak. Urutin biar detail dan subtotalnya ngumpul rapi per grup.

Satu lagi: hati-hati kalau datanya sendiri punya nilai NULL. Di kasus itu, GROUPING() jadi satu-satunya cara aman bedain NULL total dari NULL asli.

Penutup

GROUPING SETS ngubah laporan multi-level dari tumpukan UNION ALL jadi satu query bersih. Yang perlu kamu bawa:

  • Tiap kurung dalam GROUPING SETS adalah satu level ringkasan.
  • Kurung kosong () berarti grand total.
  • Pakai GROUPING() plus CASE buat kasih label baris subtotal.

Mau query kayak gini jadi kebiasaan, bukan hafalan? Latihan langsung di NgulikSQL sambil ngerjain kasus data beneran. Referensi sintaks resminya ada di dokumentasi PostgreSQL GROUPING SETS. Lanjut baca cara bikin pivot dinamis di SQL buat naikin level laporanmu.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Composite Index di SQL: Cara Kerja dan Urutan Kolom
Tutorial SQL
8 Oktober 2026•8 menit baca

Composite Index di SQL: Cara Kerja dan Urutan Kolom

Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.

BimaBima
Menghitung Stickiness (DAU/MAU) di SQL
Tutorial SQL
5 Oktober 2026•10 menit baca

Menghitung Stickiness (DAU/MAU) di SQL

Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.

BimaBima
Menghitung DAU dan MAU dengan SQL
Tutorial SQL
3 Oktober 2026•9 menit baca

Menghitung DAU dan MAU dengan SQL

DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore