Business Question: Cara Menyusun Pertanyaan Data yang Tajam
Pernah nggak sih dikasih pertanyaan dari tim bisnis kayak gini: “Kayaknya penjualan bulan ini turun deh, kenapa ya?” atau “Customer kita masih pada aktif belanja nggak sih?”. Kedengarannya simpel, tapi begitu kamu buka database, kamu malah bingung harus mulai query dari mana. Kolom mana yang dipakai? Periode yang dibandingin yang mana? Ukurannya pakai apa?
Ini masalah klasik yang sering dialami data analyst: dapet pertanyaan bisnis yang masih mentah, terus bingung nerjemahinnya jadi query. Di artikel ini kita bahas cara nyusun business question yang tajam, biar setiap kali dapet request dari tim bisnis, kamu langsung tahu harus mulai dari mana.
Masalahnya bukan di skill SQL kamu, tapi di pertanyaannya sendiri yang masih terlalu umum. Sebelum nulis satu baris query pun, seorang data analyst perlu jago dulu ngubah pertanyaan yang vague itu jadi Business Question yang spesifik dan bisa dijawab dengan data.
💡 Emang Kenapa Sih Business Question Itu Penting?
- Bikin analisis kamu fokus, nggak muter-muter nyari “yang penting ada insight”.
- Ngirit waktu, karena kamu nggak perlu query ulang gara-gara salah arah dari awal.
- Jadi dasar buat nentuin metrik dan tabel mana yang perlu dipakai.
- Bikin hasil analisis kamu nyambung sama kebutuhan stakeholder, bukan cuma “angka doang”.
- Salah satu skill yang paling sering dites pas interview data analyst.
Konsep menyusun pertanyaan analitik yang tajam ini juga umum dipakai di dunia data analytics internasional. Kalau kamu butuh referensi dasar soal sintaks SQL yang nanti dipakai buat menjawab business question, W3Schools punya dokumentasi dasar SQL yang bisa jadi pegangan sebelum praktik di bagian bawah artikel ini.
Business Question vs Pertanyaan Bisnis Biasa
Nggak semua pertanyaan dari tim bisnis otomatis jadi business question yang bagus. Business question yang baik itu biasanya punya 4 ciri ini:
| Kriteria | Contoh Buruk | Contoh Baik |
|---|---|---|
| Specific (spesifik) | “Penjualan turun kenapa?” | “Kategori Elektronik turun berapa persen?” |
| Measurable (terukur) | “Customer kita gimana?” | “Berapa customer yang tidak order lebih dari 20 hari?” |
| Time-bound (ada rentang waktu) | “Kontribusi kota gimana?” | “Kontribusi revenue per kota selama Juni-Juli 2026?” |
| Actionable (bisa ditindaklanjuti) | “Data kita banyak banget” | “Kota mana yang perlu promosi tambahan?” |
Business Question yang baik biasanya dipakai buat hal-hal berikut:
- Menentukan prioritas analisis sebelum buka dashboard/database
- Briefing antara data analyst dan tim bisnis/stakeholder
- Menyusun laporan yang langsung nyambung ke keputusan, bukan sekadar angka
- Validasi apakah data yang ada cukup buat menjawab kebutuhan bisnis
Framework Buat Mempertajam Business Question
Salah satu cara paling gampang buat ngubah pertanyaan vague jadi tajam adalah pakai 5W1H (What, Why, Who, When, Where, How). Intinya, tiap kali dapet pertanyaan mentah dari tim bisnis, coba tanya balik hal-hal ini:
- What — Metrik apa yang mau diukur? (revenue, jumlah unit, jumlah customer, dst)
- Who — Objek yang dianalisis siapa/apa? (produk, customer, kategori, kota)
- When — Periode waktunya kapan, dan dibandingin sama periode apa?
- Where — Cakupannya di mana? (semua data, atau per segmen tertentu)
- How — Diukur/dihitung pakai cara apa? (total, rata-rata, persentase perubahan)
Biar makin ngerti:
- Nggak semua pertanyaan butuh dijawab pakai kelima elemen 5W1H sekaligus.
- Yang paling wajib biasanya What (metrik) dan When (periode), karena tanpa dua ini query jadi susah dibikin.
- Kalau bisa, business question yang tajam sebaiknya bisa langsung “dibayangkan” jadi satu query SQL.
1. Siapin Tools-nya Dulu
Sama kayak praktik di artikel Analisis Top-N dengan SQL, kita pakai SQLite lewat Python (library sqlite3 bawaan Python) plus pandas biar hasil query gampang dibaca dalam bentuk tabel. Kalau kamu pakai Google Colab, tinggal import aja, nggak perlu install apa-apa.
Import Library
import sqlite3
import pandas as pd2. Siapin Dataset-nya
Kita pakai dataset toko online yang sama dengan artikel Top-N Analysis: 4 tabel (customers, products, orders, order_items), tapi kali ini datanya mencakup 2 bulan (Juni & Juli 2026) dan beberapa kota berbeda, biar bisa dipakai buat contoh business question soal perbandingan periode dan perbandingan wilayah.
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.executescript("""
CREATE TABLE customers (
customer_id INTEGER PRIMARY KEY,
customer_name TEXT,
city TEXT
);
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT,
category TEXT,
price INTEGER
);
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER,
order_date TEXT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE order_items (
order_item_id INTEGER PRIMARY KEY,
order_id INTEGER,
product_id INTEGER,
quantity INTEGER,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
""")
conn.commit()
print("Tabel berhasil dibuat")Lanjut, kita isi tabelnya dengan data dummy (bisa langsung copy dari notebook praktik). Ada order dari bulan Juni dan Juli, dari beberapa kota, dengan kategori produk yang sengaja dibuat naik-turun biar hasil analisisnya kerasa nyata.
Catatan: Insert data lengkapnya ada di notebook. Bagian ini nggak perlu di-screenshot, cukup jalanin aja.
3. Studi Kasus 1: Dari Pertanyaan Vague ke Business Question yang Tajam
Pertanyaan mentah dari tim bisnis:
“Kayaknya penjualan bulan ini turun deh, kenapa ya?”
Kalau langsung dijawab tanpa dipertajam, kamu bakal bingung mau query apa. Makanya, kita pertajam dulu pakai 5W1H:
| Pertanyaan | Jawaban |
|---|---|
| Turun di mana (Who)? | Perlu dicek per kategori produk |
| Turun dibanding apa (When)? | Bulan Juni 2026 vs Juli 2026 |
| Diukur pakai apa (How)? | Total revenue |
Business question yang sudah tajam:
“Kategori produk apa yang mengalami penurunan revenue terbesar pada bulan Juli 2026 dibanding
Juni 2026?”
Sekarang kita buktikan pertanyaan ini beneran bisa dijawab lewat query:
Query Perbandingan Revenue per Kategori (Juni vs Juli)
query_penurunan_kategori = """
WITH revenue_juni AS (
SELECT p.category, SUM(oi.quantity * p.price) AS revenue_juni
FROM order_items oi
JOIN orders o ON oi.order_id = o.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date BETWEEN '2026-06-01' AND '2026-06-30'
GROUP BY p.category
),
revenue_juli AS (
SELECT p.category, SUM(oi.quantity * p.price) AS revenue_juli
FROM order_items oi
JOIN orders o ON oi.order_id = o.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date BETWEEN '2026-07-01' AND '2026-07-31'
GROUP BY p.category
)
SELECT
j.category,
j.revenue_juni,
COALESCE(l.revenue_juli, 0) AS revenue_juli,
COALESCE(l.revenue_juli, 0) - j.revenue_juni AS selisih,
ROUND((COALESCE(l.revenue_juli, 0) - j.revenue_juni) * 100.0 / j.revenue_juni, 1) AS persen_perubahan
FROM revenue_juni j
LEFT JOIN revenue_juli l ON j.category = l.category
ORDER BY persen_perubahan ASC;
"""
pd.read_sql_query(query_penurunan_kategori, conn)Jalanin query di atas, hasilnya bakal keluar tabel perbandingan revenue tiap kategori antara Juni dan Juli, lengkap sama persentase perubahannya.

Cara baca hasilnya: kategori dengan angka persen_perubahan paling negatif adalah kategori yang penurunannya paling parah. Inilah jawaban konkret dari business question yang tadinya cuma “penjualan turun kenapa ya?”.
4. Studi Kasus 2: Business Question soal Customer Berisiko Churn
Pertanyaan mentah dari tim bisnis:
“Customer kita masih pada aktif belanja nggak sih?”
| Pertanyaan | Jawaban |
|---|---|
| Siapa yang dimaksud (Who)? | Customer yang pernah order |
| “Aktif” diukur gimana (How)? | Dilihat dari tanggal order terakhir |
| Threshold-nya berapa (When)? | Belum order lagi lebih dari 20 hari sejak order terakhir di dataset (27 Juli 2026) |
Business question yang sudah tajam:
“Customer mana saja yang belum melakukan order lebih dari 20 hari sejak tanggal transaksi
terakhirnya (per 27 Juli 2026)?”
Query Deteksi Customer Berisiko Churn
query_churn_risk = """
SELECT
c.customer_name,
c.city,
MAX(o.order_date) AS order_terakhir,
CAST(julianday('2026-07-27') - julianday(MAX(o.order_date)) AS INTEGER) AS hari_sejak_order_terakhir
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name, c.city
HAVING hari_sejak_order_terakhir > 20
ORDER BY hari_sejak_order_terakhir DESC;
"""
pd.read_sql_query(query_churn_risk, conn)
Cara baca hasilnya: customer yang muncul di daftar ini adalah kandidat yang perlu di-follow up, misalnya dikirim promo atau reminder, karena udah lama nggak bertransaksi.
5. Studi Kasus 3: Business Question soal Kontribusi Kota
Pertanyaan mentah dari tim bisnis:
“Ekspansi kita ke berbagai kota udah bagus belum ya hasilnya?”
| Pertanyaan | Jawaban |
|---|---|
| Diukur pakai apa (How)? | Total revenue per kota |
| Periode apa (When)? | Sepanjang data yang ada (Juni-Juli 2026) |
| Buat keputusan apa? | Menentukan kota mana yang kontribusinya paling kecil |
Business question yang sudah tajam:
“Kota mana yang memberikan kontribusi revenue paling kecil sepanjang Juni-Juli 2026?”
Query Revenue per Kota
query_revenue_per_kota = """
SELECT
c.city,
SUM(oi.quantity * p.price) AS total_revenue,
COUNT(DISTINCT o.order_id) AS jumlah_order
FROM order_items oi
JOIN orders o ON oi.order_id = o.order_id
JOIN customers c ON o.customer_id = c.customer_id
JOIN products p ON oi.product_id = p.product_id
GROUP BY c.city
ORDER BY total_revenue ASC;
"""
pd.read_sql_query(query_revenue_per_kota, conn)
Cara baca hasilnya: kota yang muncul paling atas (revenue terkecil) adalah kandidat evaluasi — apakah perlu promosi lokal tambahan, atau memang pasarnya belum berkembang.
6. Kesalahan yang Sering Terjadi
- Langsung buka SQL/dashboard tanpa nulis dulu business question-nya secara eksplisit.
- Business question kebanyakan elemen sekaligus, jadi susah diterjemahkan ke satu query.
- Nggak nentuin periode waktu pembanding, jadi hasil “naik/turun” nggak ada patokannya.
- Metrik yang dipakai nggak sesuai kebutuhan (misalnya pakai jumlah unit padahal yang dicari itu dampak ke revenue).
Biar Nggak Lupa, Ini Rangkumannya
| Elemen | Fungsi | Contoh |
|---|---|---|
| What | Menentukan metrik yang mau diukur | Revenue, jumlah customer, jumlah order |
| When | Menentukan periode dan pembanding | Juni 2026 vs Juli 2026 |
| Who | Menentukan objek yang dianalisis | Kategori produk, customer, kota |
| How | Menentukan cara pengukuran | Total, rata-rata, persentase perubahan |
Kalau Digabung, Alurnya Kayak Gini
⬇
🔍 Pertajam pakai 5W1H (What, Who, When, Where, How)
⬇
🎯 Business Question (spesifik & terukur)
⬇
🧮 Terjemahkan ke Query SQL
⬇
✅ Insight & Rekomendasi Aksi
📝 Catatan Dikit
Business question yang bagus itu nggak harus rumit. Justru semakin sederhana dan spesifik, semakin gampang diterjemahkan jadi query. Kalau kamu masih ragu, coba tes: “Kalau pertanyaan ini aku terjemahkan ke SQL, kira-kira query-nya kayak apa?” Kalau kamu bisa bayangin query-nya, berarti business question-nya udah cukup tajam.
Abis Ini Belajar Apa Lagi?
🚀 Kalau udah pede sama Business Question, lanjut aja ke materi-materi ini:
- Analisis Top-N dengan SQL: Produk Terlaris, Customer Terbesar
- Cara Menjawab Business Question dengan Kombinasi SQL dan Python
- Analisis Cohort & Customer Retention pakai SQL
- Laporan Analisis Data: Struktur dan Format Profesional
Materi-materi ini lanjutan yang natural setelah kamu jago nyusun business question, karena selanjutnya tinggal fokus ke teknik query dan cara mengemas hasilnya jadi laporan.
Penutup
Sebelum buru-buru buka SQL atau dashboard, luangin waktu dulu buat mikirin: business question apa yang sebenarnya mau dijawab? Pertanyaan yang tajam bakal ngirit waktu kamu dan bikin hasil analisis lebih nyambung sama kebutuhan bisnis.
Coba deh mulai biasain, tiap kali dapet request dari tim bisnis, jangan langsung ngoding. Tulis dulu business question-nya, cek pakai 5W1H, baru abis itu buka database.
🎉 Keren!
Sekarang kamu udah paham cara mengubah pertanyaan bisnis yang vague jadi business question yang spesifik dan bisa dijawab dengan data, lengkap dengan 3 studi kasus praktik dari penurunan revenue, customer churn, sampai kontribusi kota. Ini modal penting sebelum lanjut ke analisis SQL yang lebih kompleks.
Ditulis oleh Aziz Achmad Juniar
Mau Kuasai Business Question: Cara Menyusun Pertanyaan Data yang Tajam Sampai Bisa Praktik Langsung?
Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.
Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →
Analisis Top-N dengan SQL: Produk Terlaris, Customer Terbesar
Kalau kamu kerja sama data penjualan, pasti pernah dapet pertanyaan kayak gini dari tim bisnis: “Produk apa yang paling laris bulan ini?” atau “Siapa 10 customer dengan belanja terbesar?”. Pertanyaan-pertanyaan kayak gini jawabannya bisa didapet lewat teknik yang namanya Top-N Analysis.
Top-N Analysis itu sederhananya adalah cara buat nemuin “N data teratas” dari suatu ukuran tertentu, contohnya top 5 produk terlaris, top 10 customer paling boros, atau top 3 kota dengan penjualan tertinggi. Di SQL, ini bisa dikerjain pakai kombinasi GROUP BY, ORDER BY, LIMIT, sampai Window Function kayak RANK().
💡 Emang Kenapa Sih Perlu Top-N Analysis?
- Bantu tim bisnis fokus ke produk/customer yang paling berdampak.
- Jadi dasar buat keputusan stok, promosi, atau program loyalitas.
- Gampang dijalanin langsung di database, nggak perlu tarik semua data dulu.
- Bisa dikombinasikan sama filter waktu (bulanan, kuartalan, tahunan).
- Salah satu query paling sering muncul di dunia kerja data analyst.
Emang Top-N Analysis Bisa Dipakai buat Apa Aja?
Top-N bukan cuma soal “produk terlaris” doang, tapi konsepnya bisa dipakai ke banyak kasus:
- Nentuin produk terlaris berdasarkan jumlah unit terjual.
- Nentuin produk paling menguntungkan berdasarkan total revenue.
- Nemuin customer dengan total belanja terbesar (biasa disebut VIP customer).
- Ranking cabang/toko dengan performa penjualan terbaik.
- Nyari Top-N per kategori, misalnya produk terlaris di tiap kategori barang.
Top-N Analysis ini sering banget dipakai diam-diam di balik proses berikut:
- Dashboard sales & e-commerce (best seller product)
- Program loyalitas customer (siapa yang dapet reward VIP)
- Laporan bulanan/kuartalan buat manajemen
- Rekomendasi produk berdasarkan tren terlaris
- Analisis performa cabang/toko/sales region
Enaknya Pakai Top-N Query di SQL
- Nggak perlu narik semua data ke aplikasi, cukup query langsung di database.
- Bisa digabung sama filter tanggal, kategori, atau region dengan mudah.
- Kalau pakai Window Function, bisa dapet Top-N per grup sekaligus dalam satu query.
- Hasilnya konsisten dan gampang dijadwalin buat laporan otomatis.
Tapi Ya, Ada Beberapa Hal yang Perlu Diperhatiin
- LIMIT doang kadang nggak adil kalau ada nilai yang sama persis (ties), makanya sering dipasangin sama RANK() atau DENSE_RANK().
- Salah pilih ukuran (quantity vs revenue) bisa ngasih hasil Top-N yang beda jauh maknanya.
- Query bisa lambat kalau tabelnya gede dan belum ada index di kolom yang di-JOIN/GROUP BY.
Buat referensi tambahan soal sintaks dasar LIMIT dan ORDER BY di SQL, kamu bisa cek dokumentasi SQL TOP/LIMIT di W3Schools.
Kenalan Yuk sama Komponen Penting di Top-N Query
Sebelum praktik, kenalan dulu sama fungsi-fungsi SQL yang bakal sering dipakai:
| Komponen | Artinya |
|---|---|
| GROUP BY | Ngelompokin data berdasarkan kolom tertentu (misal per produk/per customer) |
| SUM() / COUNT() | Ngitung total kuantitas, total revenue, atau jumlah transaksi per grup |
| ORDER BY … DESC | Ngurutin hasil dari yang paling besar ke paling kecil |
| LIMIT N | Ngambil cuma N baris teratas dari hasil yang udah diurutin |
| RANK() / DENSE_RANK() | Window function buat kasih peringkat, termasuk handle data yang nilainya sama (ties) |
| PARTITION BY | Bikin ranking terpisah per grup, misal Top-N per kategori produk |
1. Siapin Tools-nya Dulu
Buat praktik ini, kita pakai SQLite lewat Python (library sqlite3 yang udah bawaan Python) plus pandas biar hasil query-nya gampang dibaca dalam bentuk tabel. Kalau kamu pakai Google Colab, semuanya udah otomatis tersedia, tinggal import aja. Kamu juga bisa pakai tools lain kayak DB Fiddle atau MySQL Workbench kalau lebih terbiasa pakai itu.
Import Library
import sqlite3
import pandas as pd2. Siapin Dataset-nya
Biar praktiknya nyambung sama kasus nyata, kita bikin dataset dummy toko online yang isinya 4 tabel: customers, products, orders, dan order_items. Kode di bawah ini bakal bikin database SQLite langsung di memory (nggak perlu install database beneran).
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.executescript("""
CREATE TABLE customers (
customer_id INTEGER PRIMARY KEY,
customer_name TEXT,
city TEXT
);
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT,
category TEXT,
price INTEGER
);
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER,
order_date TEXT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE order_items (
order_item_id INTEGER PRIMARY KEY,
order_id INTEGER,
product_id INTEGER,
quantity INTEGER,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
""")
conn.commit()
print("Tabel berhasil dibuat")Kolom yang penting diperhatiin di sini adalah quantity di tabel order_items (buat ngitung unit terjual) dan price di tabel products (buat ngitung revenue).
3. Isi Dataset dengan Data Dummy
Sekarang kita masukin data contohnya. Ada 8 produk dari 3 kategori berbeda, 6 customer, dan beberapa order yang sengaja dibikin biar ada produk dan customer yang jelas-jelas “terlaris”.
cur.executescript("""
INSERT INTO customers (customer_id, customer_name, city) VALUES
(1, 'Andi Saputra', 'Semarang'),
(2, 'Budi Hartono', 'Jakarta'),
(3, 'Citra Dewi', 'Surabaya'),
(4, 'Dian Permata', 'Bandung'),
(5, 'Eka Wijaya', 'Semarang'),
(6, 'Fitri Ramadhani', 'Yogyakarta');
INSERT INTO products (product_id, product_name, category, price) VALUES
(1, 'Kaos Polos', 'Fashion', 75000),
(2, 'Celana Jeans', 'Fashion', 250000),
(3, 'Sepatu Sneakers', 'Fashion', 450000),
(4, 'Mouse Wireless', 'Elektronik', 120000),
(5, 'Keyboard Mekanik', 'Elektronik', 550000),
(6, 'Power Bank', 'Elektronik', 200000),
(7, 'Buku Novel', 'Buku', 85000),
(8, 'Notebook Catatan', 'Buku', 25000);
INSERT INTO orders (order_id, customer_id, order_date) VALUES
(1, 1, '2026-07-02'),
(2, 2, '2026-07-03'),
(3, 3, '2026-07-05'),
(4, 1, '2026-07-08'),
(5, 4, '2026-07-10'),
(6, 5, '2026-07-12'),
(7, 2, '2026-07-15'),
(8, 6, '2026-07-18'),
(9, 3, '2026-07-20'),
(10, 1, '2026-07-25');
INSERT INTO order_items (order_item_id, order_id, product_id, quantity) VALUES
(1, 1, 1, 3),
(2, 1, 4, 1),
(3, 2, 3, 1),
(4, 2, 6, 2),
(5, 3, 1, 5),
(6, 3, 7, 2),
(7, 4, 5, 1),
(8, 4, 4, 2),
(9, 5, 2, 2),
(10, 5, 8, 4),
(11, 6, 1, 10),
(12, 6, 6, 1),
(13, 7, 3, 2),
(14, 7, 5, 1),
(15, 8, 7, 3),
(16, 8, 1, 2),
(17, 9, 4, 3),
(18, 9, 3, 1),
(19, 10, 1, 8),
(20, 10, 6, 2);
""")
conn.commit()
print("Data berhasil diinsert")Biar makin ngerti:
- order_items ini tabel penghubung antara orders dan products, satu order bisa punya banyak item.
- Total unit terjual per produk = SUM(quantity) dari tabel order_items.
- Total revenue = SUM(quantity x price), jadi harus JOIN ke tabel products.
4. Top-N Produk Terlaris Berdasarkan Unit Terjual
Pertanyaan paling dasar: produk mana yang paling banyak terjual unitnya? Kita pakai GROUP BY per produk, jumlahin quantity-nya, urutin dari yang terbesar, terus ambil 5 teratas pakai LIMIT.
Query Top-5 Produk Terlaris (by Unit)
query_top_produk_unit = """
SELECT
p.product_name,
p.category,
SUM(oi.quantity) AS total_unit_terjual
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
GROUP BY p.product_id, p.product_name, p.category
ORDER BY total_unit_terjual DESC
LIMIT 5;
"""
pd.read_sql_query(query_top_produk_unit, conn)Jalanin kode di atas, hasilnya bakal keluar tabel berisi 5 produk dengan total unit terjual paling banyak.

5. Top-N Produk Terlaris Berdasarkan Revenue
Kadang produk yang unitnya paling banyak terjual belum tentu yang paling nyumbang revenue. Makanya kita perlu itung juga versi revenue-nya, yaitu quantity dikaliin harga.
Query Top-5 Produk Terlaris (by Revenue)
query_top_produk_revenue = """
SELECT
p.product_name,
p.category,
SUM(oi.quantity * p.price) AS total_revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
GROUP BY p.product_id, p.product_name, p.category
ORDER BY total_revenue DESC
LIMIT 5;
"""
pd.read_sql_query(query_top_produk_revenue, conn)Coba bandingin hasil query ini sama query sebelumnya. Biasanya bakal ada pergeseran ranking karena produk mahal walau unitnya dikit tetep bisa nyumbang revenue gede.

6. Top-N Customer dengan Belanja Terbesar
Sekarang kita pindah fokus ke customer. Query-nya mirip, cuma sekarang kita JOIN tiga tabel sekaligus: customers, orders, dan order_items (plus products buat ambil harga).
Query Top-5 Customer Terbesar
query_top_customer = """
SELECT
c.customer_name,
c.city,
SUM(oi.quantity * p.price) AS total_belanja
FROM order_items oi
JOIN orders o ON oi.order_id = o.order_id
JOIN customers c ON o.customer_id = c.customer_id
JOIN products p ON oi.product_id = p.product_id
GROUP BY c.customer_id, c.customer_name, c.city
ORDER BY total_belanja DESC
LIMIT 5;
"""
pd.read_sql_query(query_top_customer, conn)Hasil query ini biasa dipakai buat nentuin siapa aja customer yang layak masuk program VIP atau dikasih penawaran khusus.

7. Top-N per Kategori Pakai Window Function
Nah, kalau kita mau tau produk terlaris di tiap kategori (bukan cuma top produk secara keseluruhan), LIMIT aja nggak cukup. Di sinilah Window Function kayak RANK() dipakai, dikombinasikan sama PARTITION BY biar ranking-nya dihitung ulang per kategori.
Query Top-2 Produk per Kategori (by Revenue)
query_top_per_kategori = """
WITH revenue_per_produk AS (
SELECT
p.product_name,
p.category,
SUM(oi.quantity * p.price) AS total_revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
GROUP BY p.product_id, p.product_name, p.category
),
ranked AS (
SELECT
*,
RANK() OVER (
PARTITION BY category
ORDER BY total_revenue DESC
) AS rank_in_category
FROM revenue_per_produk
)
SELECT *
FROM ranked
WHERE rank_in_category <= 2
ORDER BY category, rank_in_category;
"""
pd.read_sql_query(query_top_per_kategori, conn)Biar makin ngerti:
- PARTITION BY category bikin ranking dihitung ulang dari 1 di tiap kategori, bukan ranking global.
- RANK() bakal ngasih peringkat yang sama kalau nilainya sama persis (ties), terus lompat ke peringkat berikutnya.
- DENSE_RANK() mirip RANK(), bedanya nggak ada peringkat yang “dilompatin” walau ada ties.
- ROW_NUMBER() selalu ngasih nomor urut unik, walau nilainya sama persis.

8. Cara Baca Hasil Top-N Analysis
Setelah semua query dijalanin, begini cara bacanya:
- Produk dengan unit terjual tinggi belum tentu penyumbang revenue terbesar, cek dua-duanya.
- Customer di Top-N belanja belum tentu paling sering order, bisa aja cuma sekali beli tapi nominalnya gede.
- Top-N per kategori berguna banget kalau kamu mau evaluasi tiap lini produk secara adil, bukan cuma produk yang paling “populer” secara umum.
- Kalau hasil Top-N-nya kepenuhan produk/customer yang sama terus tiap periode, itu bisa jadi sinyal buat evaluasi strategi produk lain yang kurang laku.
Biar Nggak Lupa, Ini Rangkumannya
| Fungsi | Kegunaan | Contoh |
|---|---|---|
| GROUP BY | Mengelompokkan data per produk/customer sebelum diagregasi. | GROUP BY p.product_id |
| SUM() | Menghitung total quantity atau total revenue per grup. | SUM(oi.quantity * p.price) |
| ORDER BY … DESC LIMIT N | Mengambil N baris teratas setelah data diurutkan. | ORDER BY total_revenue DESC LIMIT 5 |
| RANK() OVER (PARTITION BY …) | Membuat ranking terpisah per grup/kategori. | RANK() OVER (PARTITION BY category ORDER BY total_revenue DESC) |
Kalau Digabung, Alurnya Kayak Gini
⬇
🔗 JOIN Tabel yang Relevan
⬇
📦 GROUP BY per Produk / Customer / Kategori
⬇
📐 Hitung SUM(quantity) atau SUM(quantity x price)
⬇
🔽 ORDER BY … DESC + LIMIT N (atau RANK/PARTITION BY)
⬇
✅ Baca & Validasi Hasil Top-N
📝 Catatan Dikit
Kalau tabel kamu udah gede (jutaan baris), pastiin kolom yang dipakai buat JOIN dan GROUP BY (misalnya product_id, customer_id, order_id) udah punya index. Tanpa index, query Top-N bisa jadi lambat banget karena database harus nyisir semua baris satu-satu.
Abis Ini Belajar Apa Lagi?
🚀 Kalau udah pede sama Top-N Analysis, lanjut aja ke materi-materi ini:
- Window Function lanjutan: LAG(), LEAD(), NTILE()
- Analisis Cohort & Customer Retention pakai SQL
- RFM Analysis (Recency, Frequency, Monetary) buat segmentasi customer
- Time-based Analysis: Top-N per bulan/kuartal
- Optimasi Query dengan Index dan EXPLAIN QUERY PLAN
Materi-materi ini lanjutan yang natural setelah Top-N Analysis, dan sama-sama sering dipakai bareng-bareng di dunia kerja data analyst maupun data engineer.
Penutup
Top-N Analysis itu salah satu skill SQL paling praktis dan paling sering dibutuhin di dunia kerja. Cuma dengan GROUP BY, SUM(), ORDER BY, dan LIMIT, kamu udah bisa jawab pertanyaan bisnis kayak “produk apa yang paling laris” atau “siapa customer paling loyal”.
Kalau kamu udah nyaman sama query dasar ini, coba deh eksplor lebih jauh pakai Window Function biar bisa dapetin insight yang lebih detail, kayak Top-N per kategori atau per periode waktu.
🎉 Keren!
Sekarang kamu udah paham dasar-dasar Top-N Analysis, mulai dari nyari produk terlaris (by unit & revenue), customer terbesar, sampai Top-N per kategori pakai Window Function. Ini modal penting sebelum lanjut ke analisis SQL yang lebih kompleks.
Ditulis oleh Aziz Achmad Juniar
Mau Kuasai Business Question: Cara Menyusun Pertanyaan Data yang Tajam Sampai Bisa Praktik Langsung?
Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.
Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →