JOIN Banyak Tabel + Agregat: Membuat Laporan Penjualan
Menyambung tiga tabel atau lebih dengan JOIN berantai, menghitung pendapatan per produk dengan SUM dan GROUP BY, serta membuat laporan top 5 seperti di dunia kerja.
Peta data KopiKita
Di dunia nyata, jawaban satu pertanyaan bisnis tersebar di beberapa tabel. Pertanyaan: "Produk apa yang paling banyak menghasilkan uang?" Data yang dibutuhkan:
| Informasi | Letaknya |
|---|---|
| Berapa buah terjual | detail_pesanan.jumlah |
| Harga per buah, nama produk | produk.harga, produk.nama |
| Apakah pesanan sudah dibayar | pesanan.status |
Jalurnya: detail_pesanan → pesanan (lewat pesanan_id) dan detail_pesanan → produk (lewat produk_id).
JOIN berantai: tambahkan satu per satu
FROM detail_pesanan d
JOIN pesanan p ON p.id = d.pesanan_id
JOIN produk pr ON pr.id = d.produk_id
Setiap JOIN ... ON ... menambahkan satu tabel baru dan aturan penyambungnya. Tidak ada batas jumlah tabel (praktisnya 3–6 tabel).
Cara membangun query JOIN yang panjang: mulai dari dua tabel dan SELECT *; periksa hasilnya masuk akal; tambahkan tabel ketiga; periksa lagi; baru pilih kolom dan tambahkan agregat. Jangan menulis query besar sekali jadi.
Lengkap dengan agregat
SELECT pr.nama AS produk,
SUM(d.jumlah) AS total_terjual,
SUM(d.jumlah * pr.harga) AS pendapatan
FROM detail_pesanan d
JOIN pesanan p ON p.id = d.pesanan_id
JOIN produk pr ON pr.id = d.produk_id
WHERE p.status = 'lunas'
GROUP BY pr.id, pr.nama
ORDER BY pendapatan DESC
LIMIT 5;
+---------------------+---------------+------------+
| produk | total_terjual | pendapatan |
+---------------------+---------------+------------+
| Kopi Susu Gula Aren | 7 | 126000 |
| Tumbler KopiKita | 1 | 75000 |
| Matcha Latte | 3 | 66000 |
| Nasi Goreng Spesial | 2 | 50000 |
| Americano | 3 | 45000 |
+---------------------+---------------+------------+
Perhatikan perhitungannya: uang = jumlah × harga dihitung per baris detail, baru dijumlahkan. Kolom pr.id disertakan di GROUP BY agar dua produk bernama sama tidak menyatu.
Tips membaca dan menulis query panjang
- Satu klausa per baris,
JOINdisejajarkan: query berubah dari "tembok teks" menjadi dokumen yang bisa dibaca. - Beri alias tabel yang bermakna (
d,p,pr) dan awali setiap kolom dengannya. - Urutan berpikir: FROM/JOIN (data apa) → WHERE (baris mana) → GROUP BY (dikelompokkan bagaimana) → SELECT (angka apa) → ORDER BY/LIMIT.
- Sanity check: jumlahkan manual satu produk untuk memastikan angka laporanmu masuk akal.
Query seperti inilah yang membedakan "bisa SQL" dengan "benar-benar berguna bagi bisnis". Setelah bab ini kamu bisa menjawab pertanyaan manajer dengan data, bukan perkiraan.