Cara Menghitung Total dan Subtotal di MySQL dengan WITH ROLLUP

Saat membuat laporan penjualan, hampir selalu ada kebutuhan menampilkan subtotal per kelompok dan grand total di baris paling bawah. Banyak orang menghitungnya secara manual di PHP atau bahkan di Excel. Padahal MySQL menyediakan cara elegan lewat modifier WITH ROLLUP pada klausa GROUP BY.

Cara Kerja WITH ROLLUP
Cara Kerja WITH ROLLUP

Menyiapkan Data

CREATE TABLE penjualan (
    id INT PRIMARY KEY AUTO_INCREMENT,
    kategori VARCHAR(30),
    produk VARCHAR(40),
    jumlah INT
);

INSERT INTO penjualan (kategori, produk, jumlah) VALUES
('Minuman', 'Kopi', 120),
('Minuman', 'Teh',   80),
('Makanan', 'Roti', 150),
('Makanan', 'Donat', 90);

GROUP BY Biasa

Query GROUP BY standar hanya memberi total per grup, tanpa baris ringkasan:

SELECT kategori, SUM(jumlah) AS total
FROM penjualan
GROUP BY kategori;

Hasilnya dua baris (Minuman 200, Makanan 240). Belum ada grand total.

Menambahkan WITH ROLLUP

Cukup tambahkan WITH ROLLUP di akhir GROUP BY, MySQL otomatis menyisipkan baris grand total:

SELECT kategori, SUM(jumlah) AS total
FROM penjualan
GROUP BY kategori WITH ROLLUP;
kategoritotal
Makanan240
Minuman200
NULL440

Baris terakhir dengan kategori = NULL adalah grand total (240 + 200 = 440). Nilai NULL di sini adalah penanda khas ROLLUP untuk baris ringkasan.

Subtotal Bertingkat

Kekuatan ROLLUP terlihat saat mengelompokkan lebih dari satu kolom. Ia akan membuat subtotal untuk tiap tingkat pengelompokan:

SELECT kategori, produk, SUM(jumlah) AS total
FROM penjualan
GROUP BY kategori, produk WITH ROLLUP;
kategoriproduktotal
MakananDonat90
MakananRoti150
MakananNULL240
MinumanKopi120
MinumanTeh80
MinumanNULL200
NULLNULL440

Sekarang ada subtotal per kategori (baris dengan produk NULL) dan grand total (kedua kolom NULL). Semua dihitung otomatis oleh MySQL.

Memberi Label pada Baris Ringkasan

Baris NULL tentu kurang informatif bagi pengguna akhir. Kita bisa menggantinya dengan label seperti “Subtotal” dan “Grand Total” memakai fungsi GROUPING() yang bernilai 1 bila kolom tersebut merupakan hasil rollup:

SELECT
    IF(GROUPING(kategori), 'GRAND TOTAL', kategori) AS kategori,
    IF(GROUPING(produk) AND NOT GROUPING(kategori), 'Subtotal', produk) AS produk,
    SUM(jumlah) AS total
FROM penjualan
GROUP BY kategori, produk WITH ROLLUP;

Fungsi GROUPING() tersedia sejak MySQL 8.0. Untuk versi lama, gunakan IFNULL(kategori, 'GRAND TOTAL') sebagai gantinya, walau kurang presisi bila datanya sendiri mengandung NULL asli.

Hal yang Perlu Diperhatikan

  • Tidak bisa dipadu ORDER BY secara langsung di MySQL versi tertentu — baris rollup punya nilai NULL yang memengaruhi urutan. Bila perlu mengurutkan, bungkus query dalam subquery.
  • NULL asli vs NULL rollup. Jika data Anda memang mengandung NULL, gunakan GROUPING() untuk membedakannya dari NULL penanda rollup.
  • Hemat proses. ROLLUP menghitung semua tingkat subtotal dalam sekali jalan, jauh lebih efisien daripada beberapa query UNION.

Contoh Kasus Nyata: Laporan Penjualan Bulanan

Misalkan manajer meminta laporan penjualan per cabang dan per produk, lengkap dengan subtotal tiap cabang dan total keseluruhan. Dengan ROLLUP, satu query menyelesaikan semuanya:

SELECT
    IFNULL(cabang, 'TOTAL SEMUA CABANG') AS cabang,
    IFNULL(produk, 'Subtotal Cabang')    AS produk,
    SUM(omzet) AS total_omzet
FROM penjualan_bulanan
WHERE bulan = '2026-06'
GROUP BY cabang, produk WITH ROLLUP;

Laporan yang biasanya butuh perhitungan manual kini tersaji rapi langsung dari database, siap ditampilkan atau diekspor ke Excel.

Penutup

WITH ROLLUP adalah fitur kecil yang menghemat banyak kode. Alih-alih menghitung subtotal dan grand total secara manual di aplikasi, biarkan MySQL yang mengerjakannya. Kombinasikan dengan GROUPING() atau IFNULL() untuk memberi label yang ramah, dan laporan Anda pun langsung profesional.

Referensi: untuk pendalaman lebih lanjut, kunjungi dokumentasi resmi MySQL.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *