0Pricing
SQL Academy · Pelajaran

Melampaui Satu GROUP BY

Lakukan agregasi pada beberapa tingkat.

Melampaui Satu GROUP BY adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Keterbatasan Satu GROUP BY

Klausa GROUP BY standar memungkinkan Anda melakukan agregasi baris pada satu tingkat tertentu — misalnya, total penjualan per wilayah. Namun, bagaimana jika Anda juga ingin mendapatkan total per kategori produk dan total keseluruhan dalam kueri yang sama?

Mengulangi kueri tiga kali dan menggunakan UNION ALL memang berhasil, tetapi cara tersebut bertele-tele dan lambat. SQL menyediakan tiga ekstensi ampuh — GROUPING SETS, ROLLUP, dan CUBE — yang menyelesaikan masalah ini dengan elegan dalam satu kali proses.

SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;

Menyiapkan Tabel Contoh

Sepanjang pelajaran ini, kita akan menggunakan tabel sales sederhana yang mencatat setiap penjualan beserta wilayah, kategori, dan jumlah. Mari kita buat dan isi tabel tersebut agar setiap kueri berikutnya dapat dipahami sesuai konteksnya.

CREATE TABLE sales (
  id       SERIAL PRIMARY KEY,
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales (region, category, amount) VALUES
  ('North', 'Electronics', 1200),
  ('North', 'Clothing',     800),
  ('South', 'Electronics',  950),
  ('South', 'Clothing',     600),
  ('East',  'Electronics', 1100),
  ('East',  'Clothing',     750);

Apa Itu Pengelompokan SETS?

Pengelompokan SETS memungkinkan Anda menentukan beberapa tingkat pengelompokan independen dalam satu klausa GROUP BY. Setiap set dalam daftar menghasilkan kelompok barisnya sendiri, seolah-olah Anda menulis kueri terpisah lalu menggabungkannya dengan UNION ALL.

Sintaksnya adalah: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). Set kosong () mewakili total keseluruhan untuk semua baris.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

Membaca Keluaran Pengelompokan SETS

Saat menjalankan kueri GROUPING SETS, baris dari berbagai tingkat pengelompokan ditumpuk menjadi satu. Kolom yang tidak termasuk dalam set tertentu akan tampil sebagai NULL pada baris tersebut.

Misalnya, baris yang termasuk dalam set (region) akan memiliki NULL pada kolom category, yang menandakan bahwa total tersebut mencakup semua kategori untuk wilayah itu. Baris total keseluruhan (set kosong) memiliki NULL pada region dan category.

SELECT
  COALESCE(region,   'ALL REGIONS')   AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
)
ORDER BY region NULLS LAST, category NULLS LAST;

Memperkenalkan ROLLUP

ROLLUP adalah bentuk singkat untuk hierarki umum dari set pengelompokan. Untuk kolom (A, B), ROLLUP(A, B) secara otomatis menghasilkan set: (A, B), (A), dan ().

Fitur ini sangat cocok untuk data hierarkis, seperti tahun ke bulan ke hari, atau wilayah ke kategori. Jumlah set yang dihasilkan selalu n + 1, dengan n sebagai jumlah kolom yang dicantumkan.

-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

ROLLUP dengan Tiga Tingkat

Menambahkan kolom ketiga ke ROLLUP memperluas hierarki dengan satu tingkat tambahan. ROLLUP(A, B, C) menghasilkan empat set: (A, B, C), (A, B), (A), dan ().

Dalam contoh di bawah, year adalah tingkat terluar dan category adalah tingkat paling terperinci. Kueri tersebut menghasilkan subtotal pada setiap tahap hierarki, ditambah satu baris total keseluruhan.

SELECT
  year,
  region,
  category,
  SUM(amount) AS total
FROM (
  VALUES
    (2024, 'North', 'Electronics', 1200),
    (2024, 'North', 'Clothing',     800),
    (2024, 'South', 'Electronics',  950),
    (2025, 'North', 'Electronics', 1400),
    (2025, 'South', 'Clothing',     700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;

Memperkenalkan CUBE

CUBE bahkan lebih luas daripada ROLLUP. Untuk n kolom, fitur ini menghasilkan semua 2^n kombinasi yang mungkin dari set pengelompokan, termasuk total keseluruhan.

Untuk CUBE(region, category), set yang dihasilkan adalah: (region, category), (region), (category), dan () — totalnya empat set. Fitur ini berguna ketika Anda menginginkan total lintas dimensi dalam setiap arah, bukan hanya satu hierarki.

-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

CUBE dibandingkan ROLLUP — Kapan Menggunakan yang Mana

Pilih berdasarkan apakah dimensi Anda memiliki hierarki alami:

  • Gunakan ROLLUP ketika kolom-kolomnya bersifat hierarkis (misalnya, negara ke kota ke toko). Subtotal hanya bergerak naik melalui satu jalur.
  • Gunakan CUBE ketika kolom-kolomnya merupakan dimensi independen (misalnya, wilayah dan kategori) dan Anda menginginkan setiap kemungkinan lintas dimensi.
  • Gunakan pengelompokan SETS ketika Anda memerlukan kendali penuh dan baik ROLLUP maupun CUBE tidak sesuai dengan kebutuhan Anda secara tepat.

Fungsi Pengelompokan()

Karena NULL dapat berarti nilai yang benar-benar hilang atau penanda pengelompokan, SQL menyediakan fungsi GROUPING(). Fungsi ini mengembalikan 1 ketika kolom tersebut merupakan bagian dari baris agregat tingkat atas (penanda), dan 0 ketika kolom tersebut benar-benar digunakan untuk pengelompokan.

Dengan demikian, Anda dapat membedakan wilayah yang benar-benar bernilai NULL dari baris subtotal yang mencakup semua wilayah.

SELECT
  region,
  category,
  SUM(amount)        AS total,
  GROUPING(region)   AS is_region_subtotal,
  GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

Menggunakan Pengelompokan() untuk Memberi Label pada Baris

Pola yang umum adalah menggabungkan GROUPING() dengan ekspresi CASE untuk menghasilkan label yang mudah dipahami manusia, bukan nilai NULL mentah. Hal ini membuat keluaran kueri ROLLUP atau CUBE jauh lebih mudah dibaca dalam laporan.

SELECT
  CASE GROUPING(region)
    WHEN 1 THEN 'Grand Total'
    ELSE region
  END AS region_label,
  CASE GROUPING(category)
    WHEN 1 THEN 'All Categories'
    ELSE category
  END AS category_label,
  SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;

Mencampur Kolom Tetap dengan ROLLUP

Anda dapat mencampur kolom GROUP BY biasa dengan ROLLUP atau CUBE dalam klausa yang sama. Kolom yang dicantumkan di luar ROLLUP(...) selalu disertakan dalam setiap set pengelompokan — kolom tersebut tidak pernah digulung ke tingkat yang lebih umum.

Dalam kueri di bawah, year adalah kolom pengelompokan tetap, sedangkan region dan category ikut dalam proses rollup. Artinya, Anda mendapatkan subtotal per tahun, bukan subtotal yang mencakup semua tahun.

SELECT
  2024           AS year,
  region,
  category,
  SUM(amount)    AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;

Pemeriksaan Singkat

Uji pemahaman Anda tentang GROUPING SETS, ROLLUP, dan CUBE.

Ringkasan — Melampaui Satu GROUP BY

Dalam pelajaran ini, Anda mempelajari tiga ekstensi SQL yang sangat berguna untuk menghasilkan beberapa tingkat agregasi dalam satu kueri:

  • GROUPING SETS — kendali manual penuh; cantumkan tepat kombinasi yang Anda perlukan.
  • ROLLUP — ideal untuk hierarki; menggulung data dari tingkat paling terperinci hingga total keseluruhan.
  • CUBE — menghasilkan setiap kemungkinan lintas dimensi dari dimensi yang dicantumkan.

Anda juga mempelajari bahwa GROUPING() membedakan nilai NULL yang sebenarnya dari baris penanda agregat tingkat atas, serta bahwa pola CASE GROUPING(...) menghasilkan keluaran laporan yang rapi dan mudah dibaca.

Alat-alat ini sangat penting ketika Anda memerlukan ringkasan multidimensi — laporan bergaya pivot, dasbor, dan kueri gudang data semuanya sangat mengandalkan alat-alat tersebut.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Melampaui Satu GROUP BY” gratis?

Ya — teks lengkap “Melampaui Satu GROUP BY” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Melampaui Satu GROUP BY”?

Lakukan agregasi pada beberapa tingkat. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Melampaui Satu GROUP BY” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Melampaui Satu GROUP BY
  2. ROLLUP untuk Subtotal
  3. CUBE untuk Semua Kombinasi
  4. Penjelasan GROUPING SETS
← Kembali ke SQL Academy