Lewati ke konten utama

Belajar Fungsi Agregasi SQL

19 October 2026 • 18 menit baca • fungsi agregasi SQL, COUNT SQL, SUM SQL, AVG SQL, GROUP BY SQL, HAVING SQL, query laporan penjualan, belajar SQL untuk data analyst

Belajar Fungsi Agregasi SQL: COUNT, SUM, AVG, GROUP BY, dan HAVING

Bayangkan TokoKita kini tidak lagi memiliki lima produk. Setelah berjalan selama satu tahun, toko tersebut telah melayani ribuan transaksi setiap bulan.

Pemilik toko mulai mengajukan pertanyaan yang berbeda.

"Berapa total penjualan bulan ini?"

"Produk apa yang paling banyak terjual?"

"Kategori mana yang menghasilkan pendapatan terbesar?"

"Berapa rata-rata nilai setiap transaksi?"

Pertanyaan tersebut tidak dapat dijawab hanya dengan melihat satu baris data. Kita perlu mengolah banyak record sekaligus agar menghasilkan informasi yang berguna untuk mengambil keputusan bisnis.

Misalnya, pemilik toko tidak ingin membaca 10.000 baris transaksi satu per satu hanya untuk mengetahui total penjualan. Ia membutuhkan ringkasan yang bisa langsung dipahami.

Di sinilah fungsi agregasi SQL digunakan.

Dengan fungsi agregasi, kita dapat menghitung jumlah record, menjumlahkan nilai transaksi, menghitung rata-rata, serta mencari nilai terbesar dan terkecil. Ketika digabungkan dengan GROUP BY, kita juga dapat menghasilkan ringkasan berdasarkan kategori produk, tanggal, pelanggan, atau dimensi bisnis lainnya.

Dalam artikel ini, kita akan mempelajari fungsi agregasi SQL menggunakan MySQL secara bertahap. Setiap contoh akan berangkat dari kebutuhan nyata TokoKita, sehingga Anda memahami bukan hanya cara menulis query, tetapi juga bagaimana membaca hasilnya.

1. Apa Itu Fungsi Agregasi SQL?

Fungsi agregasi SQL adalah fungsi yang mengolah sekumpulan nilai dan menghasilkan satu nilai ringkasan untuk setiap kelompok data yang dihitung.

Beberapa fungsi agregasi yang paling sering digunakan adalah:

FungsiKegunaanContoh kebutuhan bisnis
COUNT()Menghitung baris atau nilai yang tidak NULLMenghitung jumlah transaksi
SUM()Menjumlahkan nilaiMenghitung total penjualan
AVG()Menghitung rata-rataMenghitung rata-rata nilai transaksi
MIN()Mencari nilai minimumMengetahui harga termurah
MAX()Mencari nilai maksimumMengetahui transaksi terbesar

Dokumentasi resmi MySQL menjelaskan bahwa fungsi-fungsi ini beroperasi pada sekumpulan nilai dan sering digunakan bersama GROUP BY untuk membentuk kelompok data. Baca dokumentasi fungsi agregasi MySQL.

Mari kita mulai dengan contoh paling sederhana.

Misalnya, tabel products memiliki data harga:

product_nameprice
Keyboard450000
Mouse175000
Monitor1850000
USB Hub125000
Laptop Stand275000

Jika ingin mengetahui harga tertinggi, kita tidak perlu mengambil seluruh data lalu menghitungnya secara manual.

Cukup gunakan:

SELECT MAX(price) AS harga_tertinggi
FROM products;

Hasilnya:

harga_tertinggi
1850000

Database menghitung nilai maksimum dari seluruh nilai price yang memenuhi cakupan query.

Inilah inti fungsi agregasi: mengubah sekumpulan data menjadi satu informasi ringkas.

2. Menyiapkan Data Transaksi TokoKita

Sebelum mempelajari fungsi agregasi lebih jauh, kita membutuhkan contoh transaksi yang konsisten.

Pada artikel sebelumnya, kita menggunakan tabel products untuk mempelajari cara mengambil dan mengelola data. Sekarang, kita akan menggunakan tabel sales sebagai dataset latihan agar perhitungan penjualan lebih mudah dipahami.

Untuk menyederhanakan pembelajaran, setiap baris pada tabel ini mewakili satu item penjualan. Satu pesanan dapat memiliki beberapa item, tetapi contoh awal kita belum memodelkan nomor pesanan secara terpisah.

Berikut dataset latihan yang akan digunakan.

idproduct_namecategoryquantityunit_pricesale_date
1KeyboardAksesoris24500002026-01-05
2MouseAksesoris31750002026-01-05
3MonitorMonitor118500002026-01-06
4USB HubAksesoris41250002026-01-07
5Laptop StandAksesoris22750002026-01-08
6MonitorMonitor218500002026-01-10
7MouseAksesoris11750002026-01-12
8KeyboardAksesoris14500002026-01-15

Dataset ini sengaja dibuat sederhana agar setiap perhitungan dapat diperiksa secara manual.

Kita akan menggunakan kolom berikut:

  1. id: identitas unik setiap record penjualan.
  2. product_name: nama produk.
  3. category: kategori produk.
  4. quantity: jumlah unit yang terjual.
  5. unit_price: harga per unit pada record penjualan.
  6. sale_date: tanggal penjualan.

Untuk latihan, kita dapat membuat tabel dengan struktur berikut:

CREATE TABLE sales (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(150) NOT NULL,
    category VARCHAR(100) NOT NULL,
    quantity INT NOT NULL,
    unit_price DECIMAL(12, 2) NOT NULL,
    sale_date DATE NOT NULL
);

Masukkan delapan baris data di atas menggunakan INSERT. Anda juga dapat menyiapkan dataset tersebut di lingkungan MySQL lokal atau database latihan.

Perhatikan bahwa nilai quantity dan unit_price disimpan secara terpisah. Hal ini memungkinkan kita menghitung nilai penjualan setiap item dengan rumus:

Nilai penjualan item = quantity × unit_price

Misalnya, Keyboard terjual dua unit dengan harga Rp450.000 per unit. Nilai penjualan item tersebut adalah Rp900.000.

Kita akan menggunakan konsep ini untuk menjawab pertanyaan bisnis yang lebih menarik.

3. COUNT(): Menghitung Jumlah Data

Pemilik TokoKita ingin mengetahui berapa banyak record penjualan yang tersimpan dalam tabel.

Apakah kita harus menghitung setiap baris satu per satu?

Tentu tidak. Kita dapat menggunakan COUNT().

3.1 Menghitung seluruh baris dengan COUNT(*)

SELECT COUNT(*) AS jumlah_record_penjualan
FROM sales;

Hasilnya:

jumlah_record_penjualan
8

Angka delapan berarti terdapat delapan baris pada dataset latihan.

Namun, ada satu hal penting: karena setiap baris dalam contoh ini mewakili satu item penjualan, angka delapan bukan berarti terdapat delapan pesanan unik.

Dalam database transaksi sesungguhnya, satu pesanan bisa memiliki beberapa item. Jika ingin menghitung jumlah pesanan, kita membutuhkan identitas pesanan seperti order_id.

3.2 Perbedaan COUNT(*) dan COUNT(kolom)

Sekarang, bayangkan kita ingin menghitung jumlah record yang memiliki nilai produk.

SELECT COUNT(product_name) AS jumlah_nama_produk
FROM sales;

Pada dataset kita, hasilnya juga delapan karena seluruh baris memiliki nama produk.

Namun, COUNT(*) dan COUNT(kolom) memiliki perbedaan:

  1. COUNT(*) menghitung seluruh baris yang memenuhi kondisi query.
  2. COUNT(kolom) menghitung baris yang nilai kolomnya tidak NULL.

Perbedaan tersebut menjadi penting ketika dataset memiliki nilai yang belum terisi.

Misalnya, jika ada 100 baris transaksi dan lima di antaranya memiliki nilai NULL pada kolom tertentu, COUNT(*) tetap menghitung 100 baris, sedangkan COUNT(kolom) menghitung 95 nilai non-NULL.

3.3 Menghitung jumlah produk yang berbeda

Pemilik toko kemudian bertanya:

"Berapa jenis produk berbeda yang terjual?"

Di sini, menghitung seluruh baris tidak cukup karena Keyboard dan Mouse dapat muncul berkali-kali.

Gunakan COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT product_name) AS jumlah_jenis_produk
FROM sales;

Hasilnya:

jumlah_jenis_produk
5

Lima jenis produk yang berbeda adalah Keyboard, Mouse, Monitor, USB Hub, dan Laptop Stand.

Kapan COUNT() digunakan?

  1. Menghitung jumlah record.
  2. Menghitung jumlah pelanggan.
  3. Menghitung jumlah pesanan.
  4. Menghitung nilai yang telah terisi.
  5. Menghitung jumlah kategori atau produk unik.

Dalam analisis data, pastikan Anda mengetahui apa yang sedang dihitung: baris, transaksi, pelanggan unik, atau produk unik. Perbedaan definisi tersebut dapat menghasilkan angka yang sangat berbeda.

4. SUM(): Menghitung Total Nilai Penjualan

Sekarang pemilik TokoKita mengajukan pertanyaan yang lebih penting:

"Berapa total nilai penjualan dari seluruh item yang tercatat?"

Perhatikan bahwa kita tidak dapat langsung menjumlahkan kolom unit_price, karena kolom tersebut hanya menunjukkan harga per unit, bukan nilai seluruh item yang terjual.

Kita harus menghitung nilai setiap item terlebih dahulu.

4.1 Menggunakan SUM() untuk menjumlahkan nilai

Jika kolom total_amount sudah tersedia dan menyimpan nilai penjualan setiap item, query-nya sederhana:

SELECT SUM(total_amount) AS total_penjualan
FROM sales;

Namun, dalam dataset latihan kita, kolom total_amount belum tersedia. Kita dapat menghitung nilai item langsung dari quantity dan unit_price.

SELECT
    SUM(quantity * unit_price) AS total_penjualan
FROM sales;

Hasilnya:

total_penjualan
8150000

Total penjualan pada dataset latihan adalah Rp8.150.000.

Mari kita periksa perhitungannya:

ProdukPerhitunganNilai
Keyboard3 × Rp450.000Rp1.350.000
Mouse4 × Rp175.000Rp700.000
Monitor3 × Rp1.850.000Rp5.550.000
USB Hub4 × Rp125.000Rp500.000
Laptop Stand2 × Rp275.000Rp550.000
Total
Rp8.650.000

Perhatikan bahwa tabel perhitungan di atas menunjukkan total Rp8.650.000, sehingga kita perlu mengoreksi hasil query sebelumnya. Nilai yang benar untuk dataset latihan adalah Rp8.650.000.

Contoh ini juga mengajarkan satu hal penting: hasil query perlu divalidasi, terutama saat digunakan untuk laporan keuangan atau keputusan bisnis.

4.2 Menghitung total unit yang terjual

Jika pemilik toko ingin mengetahui jumlah unit yang terjual, kita tidak perlu menjumlahkan harga.

Gunakan SUM(quantity):

SELECT
    SUM(quantity) AS total_unit_terjual
FROM sales;

Hasilnya adalah 16 unit.

Jumlah unit berbeda dengan jumlah record penjualan. Delapan record pada tabel mewakili total 16 unit karena beberapa record memiliki quantity lebih dari satu.

4.3 Menghitung total berdasarkan kondisi

Misalnya, pemilik toko ingin menghitung total nilai penjualan kategori Monitor saja.

SELECT
    SUM(quantity * unit_price) AS total_penjualan_monitor
FROM sales
WHERE category = 'Monitor';

Hasilnya adalah Rp5.550.000.

Kita menggunakan WHERE untuk menyaring data sebelum fungsi agregasi menghitung totalnya.

Pola ini akan sering Anda temui saat membuat laporan penjualan berdasarkan kategori, wilayah, tanggal, atau status transaksi.

5. AVG(): Menghitung Nilai Rata-Rata

Setelah mengetahui total penjualan, pemilik toko ingin memahami rata-rata harga produk yang tercatat.

Gunakan AVG().

SELECT
    AVG(unit_price) AS rata_rata_harga
FROM sales;

Fungsi ini menghitung rata-rata nilai unit_price dari seluruh baris yang memenuhi kondisi query.

Karena produk Monitor memiliki harga yang jauh lebih tinggi dibandingkan produk lain, nilai rata-rata harga pada dataset ini akan cukup besar.

Namun, ada perbedaan penting antara rata-rata harga per record dan rata-rata nilai pesanan.

Jika tujuan kita adalah mengetahui rata-rata harga per unit yang terjual, setiap record pada tabel latihan tersebut memiliki bobot yang sama, meskipun jumlah unitnya berbeda.

Jika kita ingin menghitung rata-rata tertimbang berdasarkan jumlah unit, kita perlu menggunakan rumus yang berbeda:

SELECT
    SUM(quantity * unit_price)
        / NULLIF(SUM(quantity), 0) AS rata_rata_tertimbang
FROM sales;

Query tersebut membagi total nilai penjualan dengan total unit yang terjual.

NULLIF(..., 0) digunakan agar pembagian tidak dilakukan ketika total unit bernilai nol.

Untuk dataset latihan, rata-rata tertimbang tersebut adalah Rp540.625 per unit.

Mengapa ini penting?

Dalam analisis data, kata "rata-rata" harus didefinisikan dengan jelas. Rata-rata harga per record, rata-rata harga per unit, dan rata-rata nilai pesanan merupakan metrik yang berbeda.

Sebelum menulis query, pastikan Anda memahami pertanyaan bisnis yang ingin dijawab.

6. MIN() dan MAX(): Mencari Nilai Terendah dan Tertinggi

Pemilik toko ingin mengetahui produk dengan harga termurah dan termahal dalam data penjualan.

Kita dapat menggunakan dua fungsi agregasi: MIN() dan MAX().

6.1 Menggunakan MIN()

SELECT
    MIN(unit_price) AS harga_terendah
FROM sales;

Hasilnya Rp125.000.

6.2 Menggunakan MAX()

SELECT
    MAX(unit_price) AS harga_tertinggi
FROM sales;

Hasilnya Rp1.850.000.

Kita juga dapat menggunakan kedua fungsi tersebut dalam satu query:

SELECT
    MIN(unit_price) AS harga_terendah,
    MAX(unit_price) AS harga_tertinggi,
    AVG(unit_price) AS rata_rata_harga
FROM sales;

Dengan begitu, database dapat menghasilkan tiga ringkasan harga sekaligus.

Fungsi ini berguna untuk:

  1. Mengetahui rentang harga produk.
  2. Memeriksa nilai transaksi ekstrem.
  3. Mengidentifikasi nilai minimum dan maksimum dalam dataset.
  4. Melakukan eksplorasi data sebelum analisis lebih lanjut.

Namun, jika ingin mengetahui nama produk yang memiliki harga tertinggi, MAX() saja belum cukup. Kita perlu mengambil baris produk yang sesuai, misalnya dengan subquery atau teknik lain yang akan dipelajari pada materi SQL berikutnya.

7. GROUP BY: Mengelompokkan Data untuk Analisis

Sampai di sini, kita telah mempelajari cara menghitung total penjualan seluruh toko.

Namun, pemilik TokoKita membutuhkan informasi yang lebih rinci.

"Berapa total penjualan setiap kategori produk?"

Jika hanya menggunakan SUM(), database menghasilkan satu nilai total. Kita membutuhkan cara untuk membagi data menjadi kelompok berdasarkan kategori.

Di sinilah GROUP BY digunakan.

7.1 Menghitung total penjualan per kategori

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category;

Hasilnya:

categorytotal_penjualan
Aksesoris3.100.000
Monitor5.550.000

Database mengelompokkan record berdasarkan category, kemudian menghitung total nilai penjualan pada setiap kelompok.

Perhatikan bahwa hasilnya tidak lagi terdiri dari delapan baris. Hasil query hanya menampilkan dua kelompok kategori yang tersedia dalam dataset.

7.2 Menghitung jumlah record dan unit per kategori

Kita juga dapat menggunakan beberapa fungsi agregasi dalam satu query.

SELECT
    category,
    COUNT(*) AS jumlah_record,
    SUM(quantity) AS total_unit,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category;

Hasilnya:

categoryjumlah_recordtotal_unittotal_penjualan
Aksesoris6123.100.000
Monitor245.550.000

Query ini memberikan gambaran yang lebih lengkap tentang performa setiap kategori.

Kita dapat mengetahui jumlah record, unit terjual, dan nilai penjualan sekaligus.

7.3 GROUP BY berdasarkan produk

Bagaimana jika pemilik toko ingin mengetahui produk yang menghasilkan penjualan terbesar?

SELECT
    product_name,
    SUM(quantity) AS total_unit,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY product_name;

Hasilnya:

product_nametotal_unittotal_penjualan
Keyboard31.350.000
Mouse4700.000
Monitor35.550.000
USB Hub4500.000
Laptop Stand2550.000

Dari hasil tersebut, kita dapat melihat bahwa Monitor menghasilkan nilai penjualan tertinggi, meskipun jumlah unitnya bukan yang terbanyak.

Ini merupakan contoh sederhana bagaimana SQL dapat membantu membedakan volume penjualan dan nilai penjualan.

7.4 Mengelompokkan berdasarkan lebih dari satu kolom

Analisis bisnis sering membutuhkan pengelompokan yang lebih rinci.

Misalnya, kita ingin menghitung total penjualan setiap produk pada setiap tanggal.

SELECT
    sale_date,
    product_name,
    SUM(quantity) AS total_unit,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY
    sale_date,
    product_name
ORDER BY
    sale_date ASC,
    product_name ASC;

Query tersebut membentuk kelompok berdasarkan kombinasi tanggal dan nama produk.

Artinya, produk yang sama pada dua tanggal berbeda akan berada dalam kelompok yang berbeda.

Teknik ini berguna untuk membuat laporan harian, rekap penjualan produk, serta menyiapkan dataset yang akan digunakan dalam dashboard analitik.

8. HAVING: Menyaring Hasil Pengelompokan

Sekarang pemilik toko ingin mengetahui kategori yang menghasilkan penjualan di atas Rp3.000.000.

Kita sudah mengetahui bahwa GROUP BY dapat menghitung total per kategori. Namun, bagaimana cara menyaring kelompok berdasarkan total tersebut?

Gunakan HAVING.

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category
HAVING SUM(quantity * unit_price) > 3000000;

Hasilnya adalah kategori Monitor dan Aksesoris, karena keduanya memiliki total penjualan di atas Rp3.000.000.

Apa perbedaan WHERE dan HAVING?

Keduanya digunakan untuk menyaring data, tetapi memiliki fungsi yang berbeda.

WHEREHAVING
Menyaring baris sebelum pengelompokanMenyaring hasil kelompok
Digunakan untuk kondisi pada data sumberSering digunakan untuk kondisi agregasi
Tidak dapat langsung menggunakan fungsi agregasi dalam kondisi yang samaDapat menggunakan fungsi agregasi
Contoh: WHERE category = 'Monitor'Contoh: HAVING SUM(quantity * unit_price) > 3000000

Contoh penggunaan WHERE:

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
WHERE sale_date >= '2026-01-10'
GROUP BY category;

Query tersebut hanya menghitung record pada tanggal 10 Januari 2026 dan setelahnya.

Sementara itu, HAVING menyaring hasil kategori berdasarkan total yang telah dihitung:

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category
HAVING SUM(quantity * unit_price) > 1000000;

Kita juga dapat menggabungkan keduanya.

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
WHERE sale_date >= '2026-01-10'
GROUP BY category
HAVING SUM(quantity * unit_price) > 1000000;

Artinya, database terlebih dahulu mempertimbangkan record dari tanggal yang ditentukan, lalu menghitung total setiap kategori, kemudian menampilkan kelompok yang totalnya memenuhi kondisi.

Memahami perbedaan WHERE dan HAVING merupakan salah satu keterampilan penting saat mulai mengerjakan query analitik.

9. ORDER BY dan LIMIT untuk Menemukan Kategori Terbaik

Hasil pengelompokan dapat diurutkan seperti hasil SELECT biasa.

Misalnya, pemilik toko ingin mengetahui kategori dengan total penjualan tertinggi.

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category
ORDER BY total_penjualan DESC;

ORDER BY total_penjualan DESC mengurutkan hasil dari total tertinggi ke terendah.

Jika hanya ingin melihat kategori teratas, kita dapat menggunakan LIMIT.

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category
ORDER BY total_penjualan DESC
LIMIT 1;

Hasilnya adalah Monitor.

Pola ini sering digunakan untuk menjawab pertanyaan seperti:

  1. Kategori dengan penjualan terbesar.
  2. Produk dengan unit terjual terbanyak.
  3. Pelanggan dengan total pembelian tertinggi.
  4. Cabang dengan pendapatan terbesar.

Namun, perlu diperhatikan bahwa kategori dengan nilai penjualan terbesar tidak selalu memiliki keuntungan terbesar. Untuk menghitung keuntungan, kita memerlukan informasi biaya yang sesuai.

10. Menghitung Penjualan per Bulan

Setelah memahami pengelompokan berdasarkan kategori, mari naik satu tingkat.

Pemilik TokoKita ingin melihat tren penjualan dari bulan ke bulan.

Dalam MySQL, kita dapat menggunakan YEAR() dan MONTH() untuk mengambil komponen tahun dan bulan dari tanggal.

SELECT
    YEAR(sale_date) AS tahun,
    MONTH(sale_date) AS bulan,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY
    YEAR(sale_date),
    MONTH(sale_date)
ORDER BY
    tahun ASC,
    bulan ASC;

Query tersebut mengelompokkan transaksi berdasarkan tahun dan bulan.

Mengapa tahun juga diperlukan?

Karena Januari 2026 dan Januari 2027 merupakan periode yang berbeda. Jika hanya mengelompokkan berdasarkan nomor bulan, seluruh transaksi Januari dari tahun yang berbeda dapat tergabung dalam kelompok yang sama.

Dalam praktik, fungsi tanggal dan format pelaporan dapat disesuaikan dengan database yang digunakan.

Materi ini menjadi fondasi penting untuk analisis tren penjualan, laporan bulanan, dan dashboard bisnis.

11. Memahami NULL dalam Fungsi Agregasi

Dalam database nyata, tidak semua nilai selalu tersedia.

Misalnya, sebagian transaksi belum memiliki nilai diskon atau biaya pengiriman karena datanya belum dimasukkan.

Fungsi agregasi umumnya mengabaikan nilai NULL ketika menghitung nilai numerik. Namun, perilakunya berbeda antara satu fungsi dan fungsi lainnya.

Misalnya, jika suatu kolom berisi nilai 100, 200, dan NULL:

SELECT
    COUNT(*) AS jumlah_baris,
    COUNT(nama_kolom) AS jumlah_nilai,
    SUM(nama_kolom) AS total_nilai,
    AVG(nama_kolom) AS rata_rata
FROM nama_tabel;

Dengan asumsi terdapat tiga baris tersebut:

  1. COUNT(*) menghasilkan 3.
  2. COUNT(nama_kolom) menghasilkan 2.
  3. SUM(nama_kolom) menghasilkan 300.
  4. AVG(nama_kolom) menghasilkan 150.

Nama tabel dan kolom pada contoh tersebut merupakan placeholder yang harus diganti dengan tabel serta kolom nyata.

Jika tidak ada nilai non-NULL yang dapat dihitung, SUM(), AVG(), MIN(), dan MAX() umumnya menghasilkan NULL. Sebaliknya, COUNT() menghasilkan nol jika tidak ada baris atau nilai yang dihitung.

Perilaku ini penting dalam analisis data. Jangan langsung menganggap nilai NULL sama dengan nol, karena keduanya memiliki makna berbeda.

Jika NULL diganti menjadi nol menggunakan COALESCE() atau fungsi sejenis, lakukan hanya jika makna bisnisnya memang mengharuskan demikian.

12. Kesalahan Umum Saat Menggunakan Fungsi Agregasi SQL

Sebelum melangkah ke query yang lebih kompleks, ada beberapa kesalahan yang perlu dihindari.

Kesalahan 1: Menjumlahkan harga tanpa memperhitungkan kuantitas

Query berikut:

SELECT SUM(unit_price)
FROM sales;

menjumlahkan harga per unit pada setiap record, bukan nilai seluruh unit yang terjual.

Untuk menghitung nilai penjualan pada dataset latihan kita, gunakan:

SELECT SUM(quantity * unit_price)
FROM sales;

Pastikan rumus yang digunakan sesuai dengan definisi metrik bisnis.

Kesalahan 2: Menggunakan COUNT(*) untuk menghitung pelanggan unik

Jika tabel berisi banyak transaksi dari pelanggan yang sama, COUNT(*) menghitung baris, bukan pelanggan unik.

Dalam kasus tersebut, kita membutuhkan identitas pelanggan dan dapat menggunakan COUNT(DISTINCT customer_id) apabila setiap pelanggan memiliki ID yang sesuai.

Kesalahan 3: Menggunakan WHERE untuk menyaring hasil agregasi

Contoh yang keliru:

SELECT category, SUM(quantity * unit_price)
FROM sales
WHERE SUM(quantity * unit_price) > 3000000
GROUP BY category;

Dalam query ini, kondisi agregasi tidak boleh ditempatkan langsung pada WHERE.

Gunakan HAVING:

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category
HAVING SUM(quantity * unit_price) > 3000000;

Kesalahan 4: Mengambil kolom yang tidak sesuai dengan GROUP BY

Ketika menggunakan GROUP BY, kolom nonagregat yang dipilih harus sesuai dengan aturan pengelompokan SQL.

Contoh yang tidak tepat:

SELECT
    category,
    product_name,
    SUM(quantity * unit_price)
FROM sales
GROUP BY category;

Dalam satu kategori bisa terdapat beberapa nama produk. Database tidak dapat menghasilkan satu nama produk yang mewakili seluruh kelompok secara bermakna tanpa aturan tambahan.

Gunakan GROUP BY pada kedua kolom jika memang ingin menganalisis setiap kombinasi kategori dan produk:

SELECT
    category,
    product_name,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category, product_name;

Kesalahan 5: Menganggap total penjualan sama dengan keuntungan

Total penjualan dihitung berdasarkan nilai barang yang dijual. Keuntungan membutuhkan informasi biaya, dan dalam praktik dapat dipengaruhi biaya operasional, diskon, pajak, retur, serta komponen lain.

Pastikan definisi metrik jelas sebelum digunakan dalam laporan.

13. Latihan SQL: Analisis Penjualan TokoKita

Sekarang saatnya mencoba sendiri.

Gunakan tabel sales yang telah disiapkan pada artikel ini.

Latihan 1

Hitung jumlah seluruh record penjualan.

Latihan 2

Hitung total unit yang terjual.

Latihan 3

Hitung total nilai penjualan menggunakan quantity dan unit_price.

Latihan 4

Hitung total penjualan untuk setiap produk.

Latihan 5

Tampilkan kategori dengan total penjualan lebih dari Rp1.000.000.

Latihan 6

Tampilkan tiga produk dengan nilai penjualan tertinggi.

Latihan 7

Hitung total penjualan untuk setiap tanggal.

Kunci jawaban

Jawaban 1 — Menghitung record

SELECT COUNT(*) AS jumlah_record
FROM sales;

Hasil: 8.

Jawaban 2 — Menghitung unit

SELECT SUM(quantity) AS total_unit
FROM sales;

Hasil: 16.

Jawaban 3 — Menghitung nilai penjualan

SELECT
    SUM(quantity * unit_price) AS total_penjualan
FROM sales;

Hasil: Rp8.650.000.

Jawaban 4 — Total penjualan per produk

SELECT
    product_name,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY product_name
ORDER BY total_penjualan DESC;

Hasil teratas: Monitor dengan Rp5.550.000.

Jawaban 5 — Kategori dengan penjualan di atas Rp1.000.000

SELECT
    category,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY category
HAVING SUM(quantity * unit_price) > 1000000;

Hasil: Aksesoris dan Monitor.

Jawaban 6 — Tiga produk dengan penjualan tertinggi

SELECT
    product_name,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY product_name
ORDER BY total_penjualan DESC
LIMIT 3;

Urutan hasilnya:

  1. Monitor — Rp5.550.000.
  2. Keyboard — Rp1.350.000.
  3. Mouse — Rp700.000.

Jawaban 7 — Total penjualan per tanggal

SELECT
    sale_date,
    SUM(quantity * unit_price) AS total_penjualan
FROM sales
GROUP BY sale_date
ORDER BY sale_date ASC;

Query tersebut menghasilkan satu baris ringkasan untuk setiap tanggal yang tercatat dalam dataset.

14. Mengapa Fungsi Agregasi Penting untuk Data Analyst dan Data Scientist?

Sampai tahap ini, Anda telah mempelajari cara mengubah sekumpulan record menjadi ringkasan yang lebih mudah dipahami.

Kemampuan tersebut merupakan fondasi analisis data.

Untuk Data Analyst

Fungsi agregasi digunakan untuk membuat laporan penjualan, menghitung KPI, membandingkan kategori, dan mengidentifikasi tren.

Misalnya, Data Analyst dapat menggunakan SUM untuk menghitung nilai penjualan, COUNT untuk menghitung jumlah pesanan, dan AVG untuk menghitung rata-rata nilai transaksi.

Hasil query dapat digunakan sebagai sumber data untuk dashboard atau laporan bisnis.

Untuk Data Scientist

Sebelum membangun model statistik atau machine learning, seorang Data Scientist perlu memahami karakteristik data yang tersedia.

Agregasi dapat membantu menghitung distribusi sederhana, rata-rata, nilai minimum, nilai maksimum, dan jumlah observasi.

Namun, agregasi bukan pengganti analisis statistik yang lebih mendalam. Pemilihan metode harus disesuaikan dengan pertanyaan penelitian dan karakteristik dataset.

Untuk Data Engineer

Fungsi agregasi juga digunakan dalam transformasi data, pembuatan ringkasan untuk data warehouse, proses ETL atau ELT, dan penyiapan dataset untuk kebutuhan analitik.

Sebagai contoh, data transaksi mentah dapat diubah menjadi tabel ringkasan penjualan harian yang lebih mudah digunakan oleh dashboard.

Di tahap selanjutnya, Anda akan mempelajari bagaimana JOIN digunakan untuk menggabungkan data dari beberapa tabel sebelum dilakukan agregasi.

Kesimpulan

Fungsi agregasi SQL membantu kita mengubah banyak baris data menjadi informasi yang lebih ringkas dan bermakna.

Melalui studi kasus TokoKita, kita telah mempelajari COUNT() untuk menghitung data, SUM() untuk menjumlahkan nilai, AVG() untuk menghitung rata-rata, serta MIN() dan MAX() untuk mencari nilai minimum dan maksimum.

Kita juga telah mempelajari GROUP BY untuk mengelompokkan data, HAVING untuk menyaring kelompok berdasarkan hasil agregasi, dan ORDER BY serta LIMIT untuk menyusun hasil analisis.

Hal terpenting bukanlah menghafal semua fungsi tersebut, melainkan memahami pertanyaan bisnis yang ingin dijawab dan memastikan rumus yang digunakan sesuai dengan definisi metriknya.

Jika Anda ingin melanjutkan ke Data Analytics, Data Science, atau Data Engineering, biasakan diri membuat ringkasan dari dataset yang semakin kompleks. Mulailah dengan menghitung total, lalu kelompokkan berdasarkan produk, kategori, tanggal, dan dimensi lain yang relevan.

Artikel berikutnya: Belajar SQL JOIN untuk Pemula — cara menggabungkan tabel pelanggan, pesanan, dan detail transaksi untuk menghasilkan laporan yang lebih lengkap.


Artikel ini disusun berdasarkan dokumentasi SQL resmi, dengan MySQL 8.4 sebagai acuan praktik:

  1. MySQL — Dokumentasi fungsi agregasi. Membahas COUNT, SUM, AVG, MIN, MAX, dan perilaku nilai NULL.


  1. Dokumentasi SELECT MySQL. Menjelaskan struktur query, termasuk WHERE, GROUP BY, HAVING, ORDER BY, dan LIMIT.


  1. Dokumentasi PostgreSQL tentang aggregate functions. Referensi tambahan untuk memahami konsep agregasi lintas database relasional.



Butuh solusi digital untuk bisnis Anda?

Diskusikan Proyek →