Analisis Data Pro: Grouping & Fungsi Agregat (COUNT, SUM, AVG) di MySQL (Part 8)
Rifqi An
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
- COUNT(): Menghitung Baris, Biar Nggak Salah Kira
- SUM(): Total Semua, Nggak Cukup Satu
- AVG(): Rata-rata Itu Penting, Biar Adil
- Menggabungkan Kekuatan: GROUP BY dan Fungsi Agregat
- HAVING: Filter Setelah Grouping, Bukan Sebelum
- Latihan Ngoding Receh: Drama Coffee Shop
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 dikolom-nya tidak NULL.COUNT(DISTINCT kolom): Menghitung jumlah nilai unik (berbeda) dikolomtertentu.
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 kemenu_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:
Tampilkan total pendapatan bulanan untuk setiap menu kopi. (Hint: Gunakan
SUM(),GROUP BY, dan mungkin fungsi tanggal sepertiMONTH()atauDATE_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;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;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!
