Mengambil Data · Pelajaran 5 dari 9
Agregasi dan GROUP BY
10 menit baca · BelajarCode
1CREATE TABLE penjualan (2 id INTEGER PRIMARY KEY,3 tanggal TEXT,4 produk TEXT,5 kategori TEXT,6 jumlah INTEGER,7 harga INTEGER8);910INSERT INTO penjualan (tanggal, produk, kategori, jumlah, harga) VALUES11 ('2026-09-01', 'Kopi susu', 'Minuman', 12, 15000),12 ('2026-09-01', 'Roti bakar', 'Makanan', 5, 18000),13 ('2026-09-02', 'Kopi susu', 'Minuman', 15, 15000),14 ('2026-09-02', 'Teh tarik', 'Minuman', 8, 12000),15 ('2026-09-03', 'Roti bakar', 'Makanan', 7, 18000),16 ('2026-09-03', 'Mi goreng', 'Makanan', 4, 20000),17 ('2026-09-03', 'Kopi susu', 'Minuman', 10, 15000);1819SELECT COUNT(*) AS transaksi,20 SUM(jumlah) AS porsi,21 SUM(jumlah * harga) AS pendapatan,22 MIN(harga) AS termurah,23 MAX(harga) AS termahal24FROM penjualan;transaksi | porsi | pendapatan | termurah | termahal 7 | 61 | 947000 | 12000 | 20000
Fungsi agregat
| Fungsi | Hasil |
|---|---|
COUNT(*) | Banyak baris |
COUNT(kolom) | Banyak nilai yang tidak NULL |
SUM(kolom) | Jumlah |
AVG(kolom) | Rata-rata |
MIN(kolom), MAX(kolom) | Terkecil, terbesar |
GROUP BY
GROUP BY membagi baris menjadi kelompok, lalu fungsi agregat dihitung untuk setiap kelompok.
1SELECT produk,2 SUM(jumlah) AS porsi,3 SUM(jumlah * harga) AS pendapatan4FROM penjualan5GROUP BY produk6ORDER BY pendapatan DESC;produk | porsi | pendapatan Kopi susu | 37 | 555000 Roti bakar | 12 | 216000 Teh tarik | 8 | 96000 Mi goreng | 4 | 80000
WHERE atau HAVING?
WHEREmenyaring baris sebelum dikelompokkan.HAVINGmenyaring kelompok setelah agregat dihitung.
1SELECT kategori,2 COUNT(*) AS transaksi,3 ROUND(AVG(jumlah), 1) AS rata_porsi4FROM penjualan5WHERE tanggal >= '2026-09-02'6GROUP BY kategori7HAVING COUNT(*) >= 2;kategori | transaksi | rata_porsi Makanan | 2 | 5.5 Minuman | 3 | 11.0
Baris tanggal 1 September dibuang oleh WHERE, lalu hanya kategori dengan minimal dua transaksi yang dipertahankan oleh HAVING.
Kolom di SELECT dan GROUP BY
Jika memakai GROUP BY, setiap kolom di SELECT sebaiknya ada di GROUP BY atau dibungkus fungsi agregat. Sebagian DBMS menolak query yang melanggarnya, dan yang mengizinkan pun bisa memberi nilai yang tidak bisa diandalkan.
Cek pemahaman
Untuk menampilkan produk yang total porsinya lebih dari 10, klausa apa yang dipakai?
Latihan
Pendapatan harian
Tampilkan pendapatan per tanggal, beserta banyak transaksinya, urut dari tanggal terawal.
Pembahasan
1SELECT tanggal,2 COUNT(*) AS transaksi,3 SUM(jumlah * harga) AS pendapatan4FROM penjualan5GROUP BY tanggal6ORDER BY tanggal;tanggal | transaksi | pendapatan 2026-09-01 | 2 | 270000 2026-09-02 | 2 | 321000 2026-09-03 | 3 | 356000
Tanggal disimpan sebagai teks berformat tahun-bulan-tanggal, sehingga urutan teksnya sama dengan urutan waktu.