Menghitung Ukuran Keranjang Belanja di SQL (Basket Size)
TL;DR
Ukuran keranjang belanja atau basket size adalah rata-rata jumlah item dalam satu order, dihitung dengan cara total item dibagi jumlah order unik. Di SQL rumusnya SUM(qty) dibagi COUNT(DISTINCT order_id). Metrik ini nunjukin seberapa banyak barang yang pelanggan beli sekali belanja, dan jadi ukuran utama buat menilai efek bundling dan cross-sell. Bedain dua hal: jumlah item total pakai kolom qty, dan jumlah produk unik pakai COUNT baris. Buat data yang miring, cek median di samping rata-rata biar nggak ketipu order borongan yang besar.
Ukuran keranjang belanja atau basket size adalah rata-rata jumlah item dalam satu order. Di SQL, rumus dasarnya total item dibagi jumlah order unik: SUM(qty) / COUNT(DISTINCT order_id).
Metrik ini nunjukin seberapa banyak barang yang pelanggan ambil sekali belanja. Dia pasangan alami dari average order value, tapi ngukur jumlah barang, bukan nilai uang. Naikin basket size artinya tiap pelanggan bawa pulang lebih banyak tanpa kamu perlu nambah pembeli baru.
Di bawah ini cara ngitungnya di SQL, dari rumus dasar sampai distribusi dan per channel, plus jebakan qty vs produk unik yang sering bikin angka salah arti.
Apa itu ukuran keranjang belanja?
Basket size adalah rata-rata jumlah barang yang dibeli dalam satu order. Hitungannya total item dibagi jumlah transaksi unik dalam periode tertentu. Kalau sebulan ada 5.000 item terjual dari 2.000 order, basket size kamu 2,5 item per order.
Angka ini kepakai buat ngukur efek strategi yang dorong orang beli lebih banyak sekali datang. Bundling, cross-sell, promo beli banyak. Semua itu targetnya naikin basket size. Kalau kampanye jalan tapi basket size datar, berarti belum ngefek.
Basket size sering dibaca bareng average order value. Aku bahas AOV terpisah di menghitung average order value di SQL, dan definisi ringkasnya ada di glossary average order value.
Gimana rumus basket size dasar di SQL?
Anggap kamu punya tabel item_transaksi dengan satu baris per item dalam order. Kolomnya order_id, produk, dan qty. Rumusnya langsung.
SELECT
ROUND(SUM(qty) * 1.0
/ COUNT(DISTINCT order_id), 2) AS rata_item_per_order,
ROUND(COUNT(*) * 1.0
/ COUNT(DISTINCT order_id), 2) AS rata_produk_unik_per_order
FROM item_transaksi;
Query ini ngasih dua angka sekaligus. Yang pertama jumlah item total, ngitung kuantitas. Yang kedua jumlah produk unik, ngitung berapa jenis produk berbeda. Bedanya penting, dan aku jelasin di bagian berikutnya.
Perhatikan * 1.0 lagi. Tanpa itu, bagi dua integer bisa motong desimal dan basket size kamu keliatan bulat padahal aslinya nggak. Dasar COUNT ada di fungsi COUNT.
Apa beda jumlah item dan jumlah produk unik?
Ini sumber kebingungan yang sering. Bayangin satu order beli 3 sabun merek sama plus 1 sampo. Jumlah item-nya 4, karena ngitung total kuantitas. Jumlah produk uniknya 2, karena cuma ada dua jenis produk.
| Ukuran | Cara hitung | Contoh order tadi |
|---|---|---|
| Jumlah item | SUM(qty) | 4 |
| Jumlah produk unik | COUNT baris | 2 |
Dua-duanya valid, tapi jawab pertanyaan beda. Jumlah item cocok buat ngukur volume barang keluar. Jumlah produk unik cocok buat ngukur seberapa beragam belanjaan, yang lebih relevan buat efek cross-sell. Tentuin mana yang kamu maksud sebelum lapor.
Gimana cara lihat rata-rata dan median basket size?
Rata-rata sederhana gampang ketarik order borongan. Buat gambaran yang lebih jujur, agregasi dulu per order, baru hitung rata-rata dan mediannya.
WITH per_order AS (
SELECT
order_id,
SUM(qty) AS total_item
FROM item_transaksi
GROUP BY order_id
)
SELECT
ROUND(AVG(total_item), 2) AS rata_basket,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_item) AS median_basket,
MAX(total_item) AS basket_terbesar
FROM per_order;
CTE per_order ngerangkum tiap order jadi satu baris dengan total itemnya. Di luar, AVG dan PERCENTILE_CONT ngitung rata-rata dan median. Kalau median jauh di bawah rata-rata, berarti ada order besar yang narik rata-rata. Dasar rata-rata ada di fungsi AVG.
Lihat distribusi ukuran keranjang
Angka rata-rata doang nyembunyiin pola. Yang lebih berguna: berapa persen order cuma 1 item, berapa yang 2-3, dan seterusnya. Kelompokin pakai CASE.
WITH per_order AS (
SELECT
order_id,
SUM(qty) AS total_item
FROM item_transaksi
GROUP BY order_id
)
SELECT
CASE
WHEN total_item = 1 THEN '1 item'
WHEN total_item BETWEEN 2 AND 3 THEN '2-3 item'
WHEN total_item BETWEEN 4 AND 6 THEN '4-6 item'
ELSE '7+ item'
END AS kelompok,
COUNT(*) AS jumlah_order
FROM per_order
GROUP BY 1
ORDER BY 1;
Distribusi ini yang beneran ngasih arah keputusan. Kalau ternyata separo order cuma beli 1 item, peluang terbesarnya bukan bikin order besar jadi lebih besar, tapi dorong pembeli tunggal beli satu barang tambahan.
Contoh kasus: basket size toko_berkah
Data 6 bulan toko_berkah online: 8.400 order, 26.900 item terjual. Semua angka di bawah dari dataset ngulikdata.
Basket size rata-ratanya keluar di 3,2 item per order. Kelihatan sehat. Tapi median-nya cuma 2 item, dan itu tanda distribusinya miring.
Waktu aku lihat distribusinya, ketahuan gambaran sebenernya.
| Kelompok | Jumlah order | Persentase |
|---|---|---|
| 1 item | 3.700 | 44% |
| 2-3 item | 2.900 | 35% |
| 4-6 item | 1.300 | 15% |
| 7+ item | 500 | 6% |
Ternyata 44% order cuma beli 1 item. Hampir separo. Rata-rata 3,2 tadi ketarik ke atas sama 6% order borongan yang isinya 7 item lebih.
Keputusan yang berubah: tim tadinya mau bikin paket bundling isi 5 produk buat naikin basket. Tapi bundling besar itu ngincer segmen yang udah beli banyak, cuma 21% order. Setelah lihat distribusi, fokusnya digeser ke cross-sell sederhana di halaman checkout buat 44% pembeli tunggal. Dorong dari 1 ke 2 item di kelompok terbesar itu efeknya jauh lebih gede.
Pecah basket size per channel
Channel yang beda sering punya pola keranjang yang beda. Order dari aplikasi bisa lebih besar dari order WhatsApp, atau sebaliknya. Gabung sama tabel transaksi buat pecah per channel.
SELECT
t.channel,
ROUND(SUM(i.qty) * 1.0
/ COUNT(DISTINCT i.order_id), 2) AS rata_item_per_order
FROM item_transaksi i
JOIN transaksi t ON i.order_id = t.order_id
GROUP BY t.channel
ORDER BY rata_item_per_order DESC;
Dasar JOIN dan GROUP BY buat query kayak gini ada di GROUP BY dan HAVING.
Kesalahan umum
Ketuker qty dan jumlah produk unik. SUM(qty) ngitung total barang, COUNT baris ngitung jenis produk. Salah pilih bikin angka salah arti.
Bagi pakai COUNT(*), bukan COUNT(DISTINCT order_id). Di data level item, COUNT(*) itu jumlah baris, bukan jumlah order. Basket size kamu jadi selalu 1.
Cuma lihat rata-rata. Tanpa distribusi, kamu nggak tahu kalau separo order ternyata pembeli tunggal. Selalu cek sebarannya.
Lupa filter order batal. Order yang dibatalin atau di-refund tetap punya baris item. Filter dulu berdasarkan status biar basket size-nya bersih.
Lupa kali 1.0. Bagi dua integer bisa motong desimal. Basket size 2,7 bisa keluar jadi 2. Paksa desimal.
FAQ
Apa itu ukuran keranjang belanja (basket size)?
Ukuran keranjang belanja atau basket size adalah rata-rata jumlah barang yang dibeli dalam satu order. Cara hitungnya total item dibagi jumlah transaksi unik. Kalau dalam sebulan ada 5.000 item terjual dari 2.000 order, basket size kamu 2,5 item per order. Metrik ini nunjukin kebiasaan belanja pelanggan dan dipakai buat ngukur efek strategi bundling, cross-sell, dan promo beli banyak.
Gimana rumus basket size di SQL?
Rumus dasarnya SUM(qty) dibagi COUNT(DISTINCT order_id) kalau kamu punya kolom kuantitas per item. Pakai COUNT(DISTINCT order_id) buat pembagi supaya satu order dihitung sekali walaupun punya banyak baris item. Tambahin kali 1.0 supaya hasilnya nggak dipotong jadi bilangan bulat, dan ROUND biar rapi. Kalau mau lihat sebaran, agregasi dulu per order lalu hitung rata-rata dan mediannya.
Apa beda jumlah item dan jumlah produk unik per order?
Jumlah item ngitung total kuantitas, jadi beli 3 sabun yang sama kehitung 3 item. Jumlah produk unik ngitung berapa jenis produk berbeda, jadi 3 sabun sama kehitung 1 produk. Di SQL, jumlah item pakai SUM(qty), sementara jumlah produk unik pakai COUNT baris atau COUNT(DISTINCT produk). Dua-duanya berguna, tapi jangan ketuker karena artinya beda buat keputusan bisnis.
Kenapa perlu lihat distribusi, bukan cuma rata-rata basket size?
Karena rata-rata bisa nyembunyiin pola penting. Basket size rata-rata 3 item kedengeran sehat, tapi bisa jadi mayoritas order cuma beli 1 item sementara segelintir order borongan narik rata-rata ke atas. Distribusi ngasih tahu berapa persen order yang cuma 1 item, berapa yang 2-3, dan seterusnya. Dari situ kamu tahu apakah masalahnya banyak pembeli tunggal yang perlu didorong.
Gimana cara naikin ukuran keranjang belanja?
Tiga cara umum: bundling produk yang sering dibeli bareng jadi satu paket, cross-sell produk pelengkap pas checkout, dan promo minimum belanja kayak gratis ongkir di atas jumlah tertentu. Sebelum jalanin, ukur dulu basket size baseline pakai SQL dan cek distribusinya. Fokus dorong order 1 item jadi 2 item biasanya lebih gampang dan berdampak besar dibanding ngejar order yang udah besar jadi lebih besar.
Penutup
Yang perlu kamu bawa soal basket size:
- Rumusnya SUM(qty) dibagi COUNT(DISTINCT order_id), jangan bagi pakai jumlah baris
- Bedain jumlah item (qty) dan jumlah produk unik, artinya beda
- Cek distribusi, bukan cuma rata-rata, biar tahu berapa persen pembeli tunggal
Coba jalanin query distribusi di data kamu, terus lihat berapa persen order yang cuma 1 item. Angka itu biasanya nunjukin peluang paling gede. Latihan query kayak gini bisa kamu lanjut di NgulikSQL, dan referensi fungsi agregat ada di dokumentasi PostgreSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Composite Index di SQL: Cara Kerja dan Urutan Kolom
Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.
Menghitung Stickiness (DAU/MAU) di SQL
Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.
Menghitung DAU dan MAU dengan SQL
DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.