Analisis Data Pro: Grouping & Fungsi Agregat (COUNT, SUM, AVG) di MySQL (Part 8)

Rifqi An Rifqi An
Maret 03, 2026


Analisis Data Pro: Grouping & Fungsi Agregat (COUNT, SUM, AVG) di MySQL (Part 8)

Halo, para developer dan calon jagoan database! Pernah merasa database kalian itu kayak lautan data yang luas banget, tapi bingung gimana cara 'menangkap' ikannya dan mengubahnya jadi informasi yang berguna? Nah, di bagian ke-8 seri Belajar Database MySQL ini, kita bakal kupas tuntas senjata rahasia para data analyst buat bikin data yang segunung itu jadi "ngomong": yaitu Grouping Data dan Fungsi Agregat macam COUNT, SUM, dan AVG. Siap bikin laporan keren tanpa perlu lembur sampai ngopi gelas ke-5? Yuk, lanjut!

Daftar Isi

Grouping Data: Ketika Data Butuh Teman Sebaya

Bayangin kalian lagi di kantin dan mau tau ada berapa anak dari tiap jurusan yang lagi ngumpul. Kalian nggak bakal ngitung satu per satu dari semua anak di kantin, kan? Pasti kalian bakal kelompokin dulu, "Oh, ini anak Informatika", "Oh, ini anak Desain Grafis", baru deh dihitung per kelompok. Nah, itulah esensi dari GROUP BY di MySQL!

GROUP BY itu perintah sakti yang bikin kita bisa mengelompokkan baris-baris data yang punya nilai sama di satu atau lebih kolom. Setelah dikelompokkan, baru deh kita bisa melakukan operasi agregat (kayak menghitung total, rata-rata, jumlah, dll.) di setiap kelompok. Ini penting banget buat analisis data, biar nggak cuma liat data mentah doang.

COUNT(): Menghitung Baris, Biar Nggak Salah Kira

Fungsi COUNT() ini udah kayak "kalkulator jumlah" di MySQL. Tugasnya gampang: menghitung berapa banyak baris di tabel, atau berapa banyak nilai non-NULL di kolom tertentu. Berguna banget buat tau total user, total produk, atau total transaksi. Anti-error deh pokoknya!

Ada beberapa cara pakai COUNT():

  • COUNT(*): Menghitung semua baris, termasuk yang punya nilai NULL.
  • COUNT(kolom): Menghitung baris yang nilai di kolom-nya tidak NULL.
  • COUNT(DISTINCT kolom): Menghitung jumlah nilai unik (berbeda) di kolom tertentu.

Contoh: Misal kita punya tabel pelanggan.


-- Menghitung total semua pelanggan
SELECT COUNT(*) AS total_pelanggan
FROM pelanggan;

-- Menghitung berapa banyak kota unik tempat pelanggan tinggal
SELECT COUNT(DISTINCT kota) AS jumlah_kota_unik
FROM pelanggan;

SUM(): Total Semua, Nggak Cukup Satu

SUM() ini ibarat kalian punya tumpukan uang receh dan pengen tau totalnya berapa. Fungsi ini bakal menjumlahkan semua nilai numerik dalam satu kolom. Cocok banget buat tau total penjualan, total pendapatan, atau total pengeluaran. Siap-siap bikin laporan keuangan dadakan!

Contoh: Kita punya tabel penjualan dengan kolom jumlah_terjual dan harga_per_item.


-- Menghitung total semua penjualan (misal, dari kolom 'jumlah_terjual')
SELECT SUM(jumlah_terjual) AS total_produk_terjual
FROM penjualan;

-- Menghitung total nilai uang dari semua transaksi
SELECT SUM(jumlah_terjual * harga_per_item) AS total_pendapatan
FROM penjualan;

AVG(): Rata-rata Itu Penting, Biar Adil

Ketika kamu pengen tau "nilai tengah" dari sekumpulan data, AVG() adalah jagoannya. Fungsi ini akan menghitung nilai rata-rata dari semua nilai numerik di kolom yang kita pilih. Berguna untuk mengetahui rata-rata harga produk, rata-rata gaji, atau rata-rata rating. Biar adil, ya kan?

Contoh: Tabel produk dengan kolom harga dan tabel ulasan dengan kolom rating.


-- Menghitung rata-rata harga semua produk
SELECT AVG(harga) AS rata_rata_harga_produk
FROM produk;

-- Menghitung rata-rata rating dari semua ulasan
SELECT AVG(rating) AS rata_rata_rating
FROM ulasan;

Menggabungkan Kekuatan: GROUP BY dan Fungsi Agregat

Nah, ini dia bagian intinya! Fungsi agregat baru akan sangat powerful kalau digabung dengan GROUP BY. Ibaratnya, kalian nggak cuma bisa ngitung jumlah atau totalnya doang, tapi bisa ngitung itu per kategori! Mari kita lihat contoh-contohnya.

COUNT() dengan GROUP BY

Mau tau berapa jumlah pelanggan dari tiap kota? Gampang!


-- Menghitung jumlah pelanggan per kota
SELECT kota, COUNT(*) AS jumlah_pelanggan
FROM pelanggan
GROUP BY kota;

Output-nya bakal nunjukkin kota dan berapa pelanggan di masing-masing kota. Keren, kan?

SUM() dengan GROUP BY

Pengen tau total pendapatan dari tiap kategori produk? Bisa banget!


-- Misal kita punya tabel 'produk' dan 'penjualan'
-- Menghitung total penjualan berdasarkan kategori produk
SELECT p.kategori, SUM(j.jumlah_terjual * j.harga_per_item) AS total_pendapatan_kategori
FROM penjualan j
JOIN produk p ON j.id_produk = p.id
GROUP BY p.kategori;

Langsung kelihatan deh, kategori mana yang paling cuan! Siap-siap jadi konsultan bisnis dadakan.

AVG() dengan GROUP BY

Mau tau rata-rata rating produk per kategori? Atau rata-rata gaji karyawan per departemen?


-- Menghitung rata-rata rating per produk (dari tabel 'ulasan' dan 'produk')
SELECT p.nama_produk, AVG(u.rating) AS rata_rata_rating
FROM ulasan u
JOIN produk p ON u.id_produk = p.id
GROUP BY p.nama_produk;

Dengan begini, kita bisa tau produk mana yang paling disukai atau yang butuh perbaikan. Jangan sampai produk kalian kena bug reputasi ya!

HAVING: Filter Setelah Grouping, Bukan Sebelum

Satu lagi senjata ampuh yang sering bikin bingung para junior programmer: HAVING. Apa bedanya dengan WHERE? Gini, WHERE itu dipakai untuk memfilter baris sebelum proses GROUP BY dilakukan. Sedangkan HAVING itu dipakai untuk memfilter hasil dari fungsi agregat setelah proses GROUP BY. Jadi, HAVING bekerja pada kelompok-kelompok data, bukan baris individu.

Contoh: Kita mau tau kota mana saja yang punya jumlah pelanggan lebih dari 5.


-- Filter kota yang punya jumlah pelanggan > 5
SELECT kota, COUNT(*) AS jumlah_pelanggan
FROM pelanggan
GROUP BY kota
HAVING COUNT(*) > 5;

Kalau pakai WHERE COUNT(*) > 5 pasti error! Karena WHERE tidak bisa memfilter hasil dari fungsi agregat. Paham bedanya, kan? Nggak ada lagi drama "kenapa ini query error?!"

Latihan Ngoding Receh: Drama Coffee Shop

Oke, biar makin jago, yuk kita latihan pakai skenario lucu. Pak Budi, pemilik kedai kopi "Ngopi Dulu, Koding Kemudian", curiga ada satu menu yang kurang laku, tapi dia juga pengen kasih bonus ke barista yang paling top. Bantuin Pak Budi dengan query MySQL, ya!

Asumsi tabel kita begini:

Tabel: menu_kopi

  • id_menu (INT, PRIMARY KEY)
  • nama_menu (VARCHAR)
  • harga (DECIMAL)

Tabel: transaksi

  • id_transaksi (INT, PRIMARY KEY)
  • id_menu (INT, FOREIGN KEY ke menu_kopi.id_menu)
  • jumlah_item (INT)
  • tanggal_transaksi (DATE)

Tabel: barista

  • id_barista (INT, PRIMARY KEY)
  • nama_barista (VARCHAR)
  • rating (DECIMAL, 1-5)

Tugas kalian:

  1. Tampilkan total pendapatan bulanan untuk setiap menu kopi. (Hint: Gunakan SUM(), GROUP BY, dan mungkin fungsi tanggal seperti MONTH() atau DATE_FORMAT())

    
    -- Jawaban untuk soal 1
    SELECT
        DATE_FORMAT(t.tanggal_transaksi, '%Y-%m') AS bulan,
        mk.nama_menu,
        SUM(t.jumlah_item * mk.harga) AS total_pendapatan
    FROM
        transaksi t
    JOIN
        menu_kopi mk ON t.id_menu = mk.id_menu
    GROUP BY
        bulan, mk.nama_menu
    ORDER BY
        bulan, total_pendapatan DESC;
    
  2. Cari tahu rata-rata rating dari setiap barista, dan urutkan dari yang paling tinggi. Siapa tahu ada barista yang perlu diberi kenaikan gaji atau minimal secangkir kopi gratis!

    
    -- Jawaban untuk soal 2
    SELECT
        nama_barista,
        AVG(rating) AS rata_rata_rating_barista
    FROM
        barista
    GROUP BY
        nama_barista
    ORDER BY
        rata_rata_rating_barista DESC;
    
  3. Tampilkan menu kopi yang terjual kurang dari 100 item totalnya sepanjang waktu, biar Pak Budi bisa evaluasi menu tersebut. Mungkin harus di-deprecate atau dibikin promo!

    
    -- Jawaban untuk soal 3
    SELECT
        mk.nama_menu,
        SUM(t.jumlah_item) AS total_item_terjual
    FROM
        transaksi t
    JOIN
        menu_kopi mk ON t.id_menu = mk.id_menu
    GROUP BY
        mk.nama_menu
    HAVING
        total_item_terjual < 100
    ORDER BY
        total_item_terjual ASC;
    

Gimana, gampang kan? Dengan GROUP BY dan fungsi agregat, kalian bisa bikin data segunung jadi laporan yang informatif dan gampang dibaca. Nggak perlu lagi pusing-pusing ngitung manual sampai kepala berasap. Tetap semangat ngoding, jangan lupa ngopi!

Bagikan Artikel Ini