Main Logo
  • Home
  • About
  • Kursus
    • Paket Kursus
    • Roadmap Profesi
    • Data & AI
      • Data Analyst
      • Data Scientist
      • AI Engineer
      • Data Engineer
      • Business Intelligence (BI) Specialist
    • Infrastruktur & Keamanan
      • Network Engineer
      • System Engineer
      • DevOps Engineer
      • Security Engineer
      • Cloud Engineer
    • Programming & Web Development
      • Web & App Developer
      • Web Developer
      • WordPress Developer
      • Mobile Developer
    • Spesialisasi
      • Blockchain Engineer
      • IOT Engineer
      • Digital Marketing Specialist
  • Elearning
  • Blog
  • Portfolio
Daftar
Main Logo
  • Home
  • About
  • Kursus
    • Paket Kursus
    • Roadmap Profesi
    • Data & AI
      • Data Analyst
      • Data Scientist
      • AI Engineer
      • Data Engineer
      • Business Intelligence (BI) Specialist
    • Infrastruktur & Keamanan
      • Network Engineer
      • System Engineer
      • DevOps Engineer
      • Security Engineer
      • Cloud Engineer
    • Programming & Web Development
      • Web & App Developer
      • Web Developer
      • WordPress Developer
      • Mobile Developer
    • Spesialisasi
      • Blockchain Engineer
      • IOT Engineer
      • Digital Marketing Specialist
  • Elearning
  • Blog
  • Portfolio

Business Question: Cara Menyusun Pertanyaan Data yang Tajam

Business Question: Cara Menyusun Pertanyaan Data yang Tajam
  • August 20, 2026
  • oleh Aziz Achmad Juniar
Business Question: Cara Menyusun Pertanyaan Data yang Tajam

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:

KriteriaContoh BurukContoh 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 pd

2. 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:

PertanyaanJawaban
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.

Hasil query business question penurunan revenue kategori produk Juni vs Juli

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?”

PertanyaanJawaban
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)
Hasil query business question deteksi customer berisiko churn

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?”

PertanyaanJawaban
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)
Hasil query business question kontribusi revenue per kota

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

ElemenFungsiContoh
WhatMenentukan metrik yang mau diukurRevenue, jumlah customer, jumlah order
WhenMenentukan periode dan pembandingJuni 2026 vs Juli 2026
WhoMenentukan objek yang dianalisisKategori produk, customer, kota
HowMenentukan cara pengukuranTotal, rata-rata, persentase perubahan

Kalau Digabung, Alurnya Kayak Gini

🗣️ Masalah Bisnis (masih vague)
⬇
🔍 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

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:

KomponenArtinya
GROUP BYNgelompokin data berdasarkan kolom tertentu (misal per produk/per customer)
SUM() / COUNT()Ngitung total kuantitas, total revenue, atau jumlah transaksi per grup
ORDER BY … DESCNgurutin hasil dari yang paling besar ke paling kecil
LIMIT NNgambil 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 BYBikin 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 pd

2. 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.

Hasil query Top-N Analysis 5 produk terlaris berdasarkan unit terjual

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.

Hasil query Top-N Analysis 5 produk terlaris berdasarkan revenue

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.

Hasil query Top-N Analysis 5 customer dengan belanja terbesar

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.
Hasil query Top-N Analysis 2 produk teratas per kategori

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

FungsiKegunaanContoh
GROUP BYMengelompokkan 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 NMengambil 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

📄 Siapin Tabel & Data (customers, products, orders, order_items)
⬇
🔗 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 →

Tags: data analysisInsight Bisnis
Previous Post
Next Post

Post comment

Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • Cara Membuat GitHub Pages untuk Portofolio Data Analyst
  • Your Data, Your Rules: Mengapa Self-Hosted Cloud Storage Penting di 2026?
  • Cara Deploy Notebook ke GitHub dengan Dokumentasi Lengkap
  • Menentukan Perangkat Jaringan Bermasalah Menggunakan SQL
  • Navbar Berantakan di HP? Ini Rahasia Bikin Navbar Responsive Auto Rapi Pakai Flexbox

Arsip

  • September 2026
  • August 2026
  • July 2026
  • June 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • September 2025
  • August 2025
  • July 2025
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • July 2017
  • June 2017
  • May 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016
  • August 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • February 2016
  • January 2016
  • December 2015
  • November 2015
  • October 2015
  • September 2015
  • August 2015
  • July 2015
  • June 2015
  • May 2015
  • April 2015
  • March 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • August 2014
  • July 2014
  • June 2014
  • May 2014
  • April 2014
  • March 2014
  • February 2014
  • January 2014
  • December 2013
  • November 2013
  • October 2013
  • September 2013
  • August 2013
  • July 2013
  • June 2013
  • May 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • December 2011
  • November 2011

Tags

apache web server dns server kursus android kursus database kursus dns dan web server kursus dns server kursus ethical hacking kursus hacking kursus jaringan kursus jaringan linux Kursus Komputer kursus komputer di solo kursus komputer di solo / surakarta kursus komputer di surakarta kursus linux Kursus Linux Forensics kursus linux networking kursus linux security kursus linux server kursus mikrotik kursus networking kursus network security kursus php Kursus PHP dan MySQL kursus php mysql kursus proxy kursus security kursus ubuntu kursus ubuntu server kursus web kursus web security kursus web server kursus wordpress kursus wordpress theme linux MySQL pelatihan komputer di solo PHP python security training komputer training komputer di solo tutorial php ubuntu wordpress

© Edusoft Center - Kursus Komputer di Solo | 2010 - 2026 | Privacy Policy | Site Map | Portfolio Magang | Butuh tim kami langsung yang mengerjakan? Lihat layanan implementasi →

All Right Reserved

WhatsApp us