TL;DR
Pareto analysis di SQL mengurutkan item dari kontribusi terbesar, menghitung running total, lalu membaginya dengan grand total jadi persen kumulatif. Item yang masuk sampai persen kumulatif 80% adalah kelompok vital. Teknik intinya pakai window function SUM() OVER (ORDER BY revenue DESC).
Pareto analysis di SQL itu cara nemuin sebagian kecil item yang nyumbang mayoritas hasil. Prinsip 80/20 bilang sekitar 20% produk sering ngasih 80% revenue.
Buat ngerjainnya, kamu urutin item dari kontribusi terbesar, hitung total berjalan, lalu ubah jadi persen kumulatif. Item yang nyampe 80% pertama itulah kelompok yang paling penting kamu jaga.
Di artikel ini kamu bakal belajar cara ngitung running total pakai window function, ngubahnya jadi persen kumulatif, dan baca hasilnya buat keputusan bisnis nyata.
Pareto analysis adalah teknik buat ngurutin penyebab dari yang paling berdampak, lalu lihat berapa sedikit penyebab yang bikin mayoritas dampak. Namanya dari prinsip 80/20: sering kali 80% hasil datang dari 20% sebab. Di konteks penjualan, ini berarti segelintir produk sering nyetir sebagian besar revenue.
Buat ngerjainnya di SQL, kamu butuh tiga langkah:
Kunci teknisnya di langkah kedua, dan itu pakai window function. Kalau kamu belum kenal, baca dulu pengantar window function di SQL.
Langkah pertama, jumlahin revenue tiap produk pakai GROUP BY, lalu urut dari yang terbesar. Ini fondasi sebelum ngitung kumulatif.
SELECT
produk,
SUM(total) AS revenue
FROM transaksi
GROUP BY produk
ORDER BY revenue DESC;Query ini kasih tabel produk dengan total revenue masing-masing, diurutkan dari juara. Buat pendalaman fungsi penjumlahan, cek fungsi agregat SQL.
Running total itu total yang terus nambah sepanjang urutan baris. Pakai SUM() OVER (ORDER BY revenue DESC), SQL njumlahin revenue baris ini plus semua baris di atasnya.
WITH per_produk AS (
SELECT produk, SUM(total) AS revenue
FROM transaksi
GROUP BY produk
)
SELECT
produk,
revenue,
SUM(revenue) OVER (ORDER BY revenue DESC) AS running_total
FROM per_produk
ORDER BY revenue DESC;Baris teratas running total-nya sama dengan revenue-nya sendiri. Baris kedua nambah revenue baris pertama. Terus gitu sampai baris terakhir, yang running total-nya sama dengan grand total semua produk.
Buat dapat persen kumulatif, bagi running total dengan grand total, lalu kali 100. Grand total-nya dihitung pakai SUM() OVER () tanpa ORDER BY, yang njumlahin semua baris.
WITH per_produk AS (
SELECT produk, SUM(total) AS revenue
FROM transaksi
GROUP BY produk
)
SELECT
produk,
revenue,
SUM(revenue) OVER (ORDER BY revenue DESC) AS running_total,
ROUND(
100.0 * SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER (),
1
) AS persen_kumulatif
FROM per_produk
ORDER BY revenue DESC;Kolom persen_kumulatif nunjukin berapa persen total revenue yang udah kekumpul sampai baris itu. Produk pertama yang persen kumulatifnya nyampe 80% adalah batas kelompok vital kamu. Buat teknik persentase lain, baca cara menghitung persentase di SQL.
Buat ngasih label kelompok, bungkus hasil tadi pakai CTE lagi, lalu pakai CASE buat nandain baris sampai 80%. Ini bikin hasilnya langsung kebaca tanpa hitung manual.
WITH pareto AS (
-- query persen_kumulatif dari langkah sebelumnya
SELECT produk, revenue,
ROUND(100.0 * SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER (), 1) AS persen_kumulatif
FROM (
SELECT produk, SUM(total) AS revenue
FROM transaksi GROUP BY produk
) t
)
SELECT
produk, revenue, persen_kumulatif,
CASE WHEN persen_kumulatif <= 80 THEN 'Vital (80%)'
ELSE 'Sisanya' END AS kelompok
FROM pareto
ORDER BY revenue DESC;Toko_berkah punya 480 jenis produk di tabel transaksi selama 6 bulan. Aku jalanin analisa Pareto buat tau produk mana yang beneran nyetir revenue.
Hasilnya jelas: dari 480 produk, cuma 71 produk yang masuk kelompok 80% teratas. Artinya 14,8% produk nyumbang 80% revenue. Angkanya nggak persis 20/80, tapi polanya sama, mayoritas hasil datang dari sebagian kecil item.
Yang lebih menarik, 5 produk teratas sendiri nyumbang 31% revenue. Semuanya kategori Sembako: beras, minyak goreng, gula, telur, dan tepung. Sisanya, 409 produk yang cuma nyumbang 20%, banyak yang stoknya numpuk dan jarang laku.
Insight ini langsung kepakai. Tim mutusin prioritasin ketersediaan stok 71 produk vital, dan mulai kurangi variasi produk ekor panjang yang bikin modal nyangkut. Modal yang tadinya ke-lock di produk lambat, dialihkan ke produk cepat.
ORDER BY revenue DESC, running total-nya salah dan persen kumulatifnya ngaco.100.0 biar hasilnya pecahan.SUM() OVER () buat grand total harus tanpa ORDER BY, biar dia njumlahin semua baris, bukan kumulatif.Nggak. 80/20 itu pola umum, bukan angka pasti. Di data nyata kamu bisa nemu 70/30, 90/10, atau 85/15 tergantung bisnisnya. Yang penting bukan angka persisnya, tapi kenyataan bahwa sebagian kecil item nyumbang mayoritas hasil. Fokusnya di nemuin kelompok vital itu, berapa pun rasio persisnya, lalu ambil keputusan dari situ.
Bisa, tapi jauh lebih ribet. Tanpa window function, kamu harus pakai self join atau subquery berkorelasi buat ngitung running total, dan itu lambat plus susah dibaca. Window function SUM() OVER (ORDER BY ...) dirancang khusus buat kasus ini. Kalau database kamu mendukungnya, dan hampir semua database modern mendukung, pakai window function adalah cara paling bersih dan cepat.
Tinggal ganti kolom di GROUP BY dari produk jadi kategori. Sisa querynya sama persis: jumlahin revenue per kategori, urut menurun, hitung running total dan persen kumulatif. Pareto bisa dipakai di level mana aja, produk, kategori, cabang, atau pelanggan. Pilih level yang keputusannya bisa kamu ambil. Kalau kamu mau atur stok, level produk paling berguna.
Total biasa dari SUM() dengan GROUP BY ngasih satu angka per grup. Running total dari SUM() OVER (ORDER BY ...) ngasih angka yang nambah tiap baris, ngikutin urutan. Jadi tiap baris punya nilai running total sendiri yang isinya jumlah baris itu plus semua baris sebelumnya. Running total inilah yang bikin analisa Pareto dan grafik kumulatif jadi mungkin.
Bisa banget. Prinsip 80/20 berlaku di banyak hal: keluhan pelanggan, cacat produksi, sumber trafik, atau jam kerja per tugas. Kamu tinggal ganti kolom yang dijumlah sesuai yang mau dianalisa. Misalnya, cari 20% jenis keluhan yang bikin 80% tiket support. Tekniknya sama, cuma metriknya beda. Ini yang bikin Pareto jadi alat serbaguna buat prioritas.
Yang perlu kamu inget: Pareto butuh tiga langkah, jumlahin per item dan urut menurun, hitung running total pakai SUM() OVER (ORDER BY), lalu bagi dengan grand total buat persen kumulatif. Kelompok yang nyampe 80% pertama itu prioritas kamu.
Sekarang coba di data penjualan kamu sendiri. Mau latihan window function dengan dataset Indonesia? Cek NgulikSQL buat praktek langsung di browser.
Lanjut baca cara menghitung persentase di SQL, atau lihat dokumentasi resmi window function PostgreSQL buat pendalaman.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nambah 30 hari ke tanggal invoice, ngurangin sebulan buat cari periode lalu, ngitung selisih hari antar order. Semua itu aritmetika tanggal, dan SQL punya operator INTERVAL buat ngerjainnya.
Ngurangin tahun sekarang sama tahun lahir kelihatan gampang, tapi hasilnya sering meleset setahun kalau ulang tahunnya belum lewat. Ini cara hitung umur yang akurat di SQL.
Cara pakai DATE_TRUNC di SQL buat memotong timestamp jadi awal bulan, minggu, atau jam. Kunci bikin laporan penjualan per periode yang rapi.