SUM dan AVG SQL: Hitung Total dan Rata-rata dengan Benar
Blog/Tutorial SQL/SUM dan AVG SQL: Hitung Total dan Rata-rata dengan Benar

SUM dan AVG SQL: Hitung Total dan Rata-rata dengan Benar

BimaBima
·29 Januari 2026·8 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

SUM di SQL menjumlahkan semua nilai angka di sebuah kolom, sementara AVG menghitung rata-ratanya. Dua-duanya diam-diam melewati baris yang nilainya NULL, jadi AVG membagi dengan jumlah baris non-NULL, bukan jumlah baris total. Kalau kamu mau NULL dihitung sebagai nol, bungkus kolomnya pakai COALESCE(kolom, 0) dulu.

SUM di SQL menjumlahkan angka di sebuah kolom. AVG ngitung rata-ratanya. Dua fungsi ini yang paling sering kamu pakai begitu selesai belajar SELECT.

SELECT SUM(total) AS total_omzet,
       AVG(total) AS rata_rata_transaksi
FROM penjualan;

Sampai sini gampang. Yang bikin banyak analis kejeblos: dua-duanya ngelewatin baris NULL tanpa bunyi.

Nggak ada warning. Nggak ada error. Angka rata-rata kamu cuma... salah.

Apa itu SUM dan AVG di SQL?

SUM dan AVG adalah fungsi agregat — fungsi yang ngambil banyak baris dan ngeluarin satu angka. SUM menjumlahkan seluruh nilai di kolom yang kamu sebut. AVG membagi jumlah itu dengan banyaknya baris yang nilainya bukan NULL. Dua-duanya cuma jalan di kolom angka.

Kalau kamu belum kenal fungsi agregat lain, mampir dulu ke panduan fungsi agregat SQL — di situ COUNT, MIN, dan MAX dibahas sekalian.

Gimana cara pakai SUM dan AVG?

Pakai dataset toko_berkah, 10 transaksi Januari 2026. Kolomnya: id_transaksi, tanggal, kota, kategori, total, ongkir.

idkotakategoritotalongkir
1BandungMinuman30.000NULL
2BandungMakanan45.00010.000
3SurabayaMinuman45.00012.000
4SurabayaSembako120.000NULL
5MedanMakanan90.00015.000
6BandungSembako120.00010.000
7MedanMinuman60.000NULL
8SurabayaMakanan45.00012.000
9BandungMinuman30.00010.000
10MedanSembako120.00015.000

Ongkir NULL artinya pelanggan ambil sendiri di toko. Bukan gratis ongkir — emang nggak ada ongkirnya.

SELECT SUM(total) AS total_omzet,
       AVG(total) AS rata_rata_transaksi
FROM penjualan;

-- total_omzet | rata_rata_transaksi
-- 705000      | 70500

Omzet Januari 705.000, rata-rata per transaksi 70.500. Dua angka ini aman.

Kenapa AVG bisa kasih hasil beda dari SUM dibagi COUNT?

Coba hitung rata-rata ongkir dengan dua cara.

SELECT AVG(ongkir)                  AS avg_ongkir,
       SUM(ongkir) * 1.0 / COUNT(*) AS ongkir_per_transaksi
FROM penjualan;

-- avg_ongkir | ongkir_per_transaksi
-- 12000      | 8400

Dua-duanya bener. Dua-duanya jawab pertanyaan yang beda.

Dari 10 transaksi toko_berkah, cuma 7 yang ada ongkirnya. AVG(ongkir) bagi 7 dan dapat 12.000. SUM(ongkir)/COUNT(*) bagi 10 dan dapat 8.400. Selisihnya 43%, dan nggak ada pesan error apa pun.

Jadi pertanyaannya: kamu mau tau rata-rata ongkir dari orang yang bayar ongkir, atau rata-rata biaya ongkir yang ditanggung per transaksi?

Kalau jawabannya yang kedua, paksa NULL jadi nol.

SELECT AVG(COALESCE(ongkir, 0)) AS avg_ongkir_semua
FROM penjualan;

-- 8400

COALESCE ngeganti setiap NULL jadi angka yang kamu tentuin. Penyebutnya balik jadi 10. Kalau kamu belum familiar sama perilaku NULL, baca dulu glosarium NULL.

Aturan simpelnya: setiap kali kamu nulis AVG di kolom yang boleh kosong, tanya ke diri sendiri — NULL di sini artinya "nol" atau "nggak tau"? Kalau nol, pakai COALESCE. Kalau nggak tau, biarin AVG ngelewatin dia.

Gimana cara hitung total dan rata-rata per grup?

Tambahin GROUP BY. SUM dan AVG bakal dihitung ulang per grup.

SELECT kota,
       COUNT(*)             AS jumlah_transaksi,
       SUM(total)           AS total_omzet,
       ROUND(AVG(total), 0) AS rata_rata
FROM penjualan
GROUP BY kota
ORDER BY total_omzet DESC;
kotajumlah_transaksitotal_omzetrata_rata
Medan3270.00090.000
Bandung4225.00056.250
Surabaya3210.00070.000

Ini insight yang nggak kelihatan dari angka total doang: Medan cuma 3 transaksi — paling sedikit bareng Surabaya — tapi omzetnya paling gede. Rata-rata transaksinya 90.000, hampir dua kali lipat Bandung.

Bandung ramai tapi keranjangnya kecil. Medan sepi tapi belanjanya besar. Dua kota ini butuh strategi yang beda, dan kamu nggak akan nyadar kalau cuma lihat SUM.

ROUND aku pakai biar hasilnya rapi. Tanpa itu, AVG suka ngeluarin angka kayak 56249.999999999.

Gimana cara jumlahin cuma sebagian baris?

Cara paling gampang pakai WHERE.

SELECT SUM(total) AS omzet_sembako
FROM penjualan
WHERE kategori = 'Sembako';

-- 360000

Tapi kalau kamu mau dua angka sekaligus dalam satu baris hasil, WHERE nggak cukup. Pakai CASE di dalam SUM.

SELECT SUM(CASE WHEN kategori = 'Sembako' THEN total ELSE 0 END)  AS omzet_sembako,
       SUM(CASE WHEN kategori <> 'Sembako' THEN total ELSE 0 END) AS omzet_lainnya
FROM penjualan;

-- omzet_sembako | omzet_lainnya
-- 360000        | 345000

Teknik ini namanya conditional aggregation. Sekali scan tabel, dapat beberapa metrik. Berguna banget waktu bikin ringkasan dashboard.

Aturan lengkap soal perilaku fungsi agregat ada di dokumentasi PostgreSQL untuk aggregate functions.

Kesalahan umum waktu pakai SUM dan AVG

  • Nyangka AVG ngitung NULL sebagai nol. Nggak. AVG ngelewatin dia dan ngecilin penyebut.
  • Pembagian bilangan bulat. Di PostgreSQL, SUM(ongkir) / COUNT(*) di kolom INTEGER hasilnya dipotong jadi bulat. Kaliin 1.0 atau pakai CAST dulu.
  • Pakai WHERE buat nyaring hasil agregat. WHERE jalan sebelum pengelompokan. Buat nyaring hasil SUM, pakai HAVING.
  • SUM di kolom yang udah ke-JOIN. Kalau JOIN-nya ngegandain baris, omzet kamu ikut ganda. Cek COUNT(*) sebelum dan sesudah JOIN.
  • Lupa ROUND di laporan. Angka 49285.714285714 di slide direksi bukan tampilan yang kamu mau.
-- Salah: WHERE nggak bisa lihat hasil SUM
-- SELECT kota, SUM(total) FROM penjualan WHERE SUM(total) > 220000 GROUP BY kota;

-- Benar: pakai HAVING
SELECT kota, SUM(total) AS total_omzet
FROM penjualan
GROUP BY kota
HAVING SUM(total) > 220000;

FAQ

Apa bedanya SUM dan COUNT di SQL?

SUM menjumlahkan nilai di dalam kolom, COUNT ngitung berapa banyak barisnya. SUM(total) dari 10 transaksi toko_berkah ngasih 705.000, sementara COUNT(*) dari data yang sama ngasih 10. Sering dipakai bareng: SUM buat omzet, COUNT buat jumlah transaksi.

Kenapa AVG hasilnya beda sama SUM dibagi COUNT?

Gara-gara NULL. AVG cuma bagi dengan baris yang terisi, SUM/COUNT(*) bagi dengan semua baris. Di toko_berkah, AVG(ongkir) ngasih 12.000 sementara SUM(ongkir)/COUNT(*) ngasih 8.400. Selisih 43% tanpa satu pun pesan error.

Apakah SUM bisa dipakai di kolom teks?

Nggak. SUM cuma jalan di kolom numerik. Kalau angkanya kesimpen sebagai teks, PostgreSQL bakal nolak, sementara MySQL diam-diam ngonversi dan kasih hasil aneh. Konversi dulu pakai CAST(kolom AS DECIMAL).

Gimana cara bulatin hasil AVG?

Pakai ROUND. Contohnya ROUND(AVG(total), 0) buat bulatin ke rupiah terdekat, atau ROUND(AVG(total), 2) buat dua desimal.

Rangkuman

  • SUM jumlahin kolom angka, AVG rata-ratain. Dua-duanya ngelewatin NULL diam-diam.
  • Kalau NULL di kolom kamu artinya "nol", bungkus pakai COALESCE(kolom, 0) sebelum di-AVG.
  • GROUP BY bikin SUM dan AVG dihitung per grup. Di toko_berkah, Medan cuma 3 transaksi tapi omzet tertinggi.

Semua query di artikel ini udah dites dan siap kamu copy-paste. Latihan langsung di halaman fungsi SUM — editor SQL-nya jalan di browser, nggak perlu install database.

Lanjut baca: MIN dan MAX SQL buat nyari transaksi terbesar dan terkecil dari tabel yang sama.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel Terkait

7 SQL Client Gratis Terbaik buat Analis Data (2026)
Tutorial SQL
10 Juli 2026•9 menit baca

7 SQL Client Gratis Terbaik buat Analis Data (2026)

Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.

BimaBima
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Tutorial SQL
7 Juli 2026•9 menit baca

SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim

Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.

BimaBima
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Tutorial SQL
4 Juli 2026•11 menit baca

Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya

Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

Copyright © 2026 - All rights reserved

LINKS
SupportPricingDatasetBlogAffiliates
LEGAL
Terms of servicesPrivacy policy
Ngulik Data
DatasetLeaderboardBlogStore