Pilih tantangan SQL dan mulai belajar dengan praktik langsung. Setiap tantangan dilengkapi dengan feedback real-time dan petunjuk.
| Nama Tantangan | Tingkat | Status |
|---|---|---|
| Hari Pertama di TokoNusantara ## Selamat Datang di TokoNusantara! 🎉 Hari ini adalah hari pertamamu sebagai **Data Analyst Junior** di TokoNusantara, startup e-commerce yang sedang naik daun di Indonesia. Pak Budi, Manager Data & Analytics, menyambutmu dengan hangat. > "Selamat datang! Tugas pertamamu sederhana. Kami punya tabel `produk` yang berisi daftar produk kami. Coba tampilkan **semua data** dari tabel tersebut agar kamu bisa mengenal katalog produk kita." ### Tugas Tampilkan semua data dari tabel `produk`. | Mudah | |
| Laporan untuk Tim Marketing ## Permintaan dari Tim Marketing Belum sampai makan siang, Ibu Sari dari Tim Marketing sudah menghampiri mejamu. > "Hai! Aku dengar kamu yang baru di tim data ya? Bisa bantu aku? Aku butuh daftar pelanggan untuk campaign email kita. Tapi aku cuma perlu **nama** dan **email** mereka saja, tidak perlu data lainnya." Pak Budi mengangguk dan membisikkan tips: > "Tidak perlu SELECT *, kamu bisa pilih kolom tertentu saja. Lebih efisien dan lebih aman untuk privasi data." ### Tugas Tampilkan hanya kolom `nama` dan `email` dari tabel `pelanggan`. | Mudah | |
| Mencari Pelanggan dari Jakarta ## Event Spesial Jakarta! Setelah makan siang, Ibu Sari kembali dengan permintaan baru: > "Kita mau adakan event offline di Jakarta minggu depan. Bisa tolong carikan pelanggan yang **tinggal di Jakarta** saja? Aku mau kirim undangan khusus ke mereka." Pak Budi menjelaskan: > "Nah, sekarang kamu perlu belajar **WHERE clause**. Ini cara kita memfilter data berdasarkan kondisi tertentu." ### Tugas Tampilkan semua data pelanggan yang tinggal di kota **Jakarta**. | Mudah | |
| Produk dengan Harga Terjangkau ## Campaign "Belanja Hemat" Sore hari, Ibu Sari datang lagi (sepertinya tim Marketing memang paling sering butuh data!): > "Kita mau buat campaign **Belanja Hemat** untuk pelanggan baru. Bisa carikan produk dengan harga **di bawah Rp 100.000**? Produk murah lebih mudah menarik pembeli pertama kali." Pak Budi menambahkan: > "Selain tanda sama dengan (=), kamu juga bisa pakai operator perbandingan lain seperti < (kurang dari), > (lebih dari), <= (kurang dari atau sama dengan), dan >= (lebih dari atau sama dengan)." ### Tugas Tampilkan semua produk dengan harga **kurang dari 100000**. | Mudah | |
| Pelanggan VIP dari Surabaya ## Program VIP Regional Hari kedua kerjamu dimulai dengan meeting pagi. Mas Andi dari Customer Success punya permintaan: > "Kita mau launch program VIP khusus untuk region Jawa Timur. Bisa tolong carikan pelanggan yang **tinggal di Surabaya** DAN sudah **belanja minimal Rp 2.000.000**? Mereka akan dapat benefit khusus." Pak Budi menjelaskan: > "Kalau ada **dua kondisi yang harus terpenuhi semua**, gunakan AND. Berbeda dengan OR yang cukup salah satu kondisi terpenuhi." ### Tugas Tampilkan pelanggan yang tinggal di **Surabaya** DAN memiliki total_belanja **>= 2000000**. | Mudah | |
| Pelanggan dari Jakarta atau Bandung ## Ekspansi ke Jawa Barat Ibu Sari kembali dengan ide campaign baru: > "Kita dapat budget untuk ekspansi marketing di region Jabodetabek dan Jawa Barat. Carikan pelanggan yang tinggal di **Jakarta** ATAU **Bandung**. Mereka akan dapat voucher gratis ongkir!" Pak Budi menjelaskan perbedaan penting: > "Berbeda dengan AND yang butuh semua kondisi terpenuhi, **OR** cukup **salah satu kondisi** saja yang terpenuhi. Kalau pelanggan di Jakarta → masuk. Di Bandung → juga masuk. Di keduanya? Tetap masuk!" ### Tugas Tampilkan pelanggan yang tinggal di **Jakarta** ATAU **Bandung**. | Mudah | |
| Daftar Produk Termahal ## Analisis Harga Produk Di hari ketiga, Mbak Dewi dari Finance memanggilmu: > "Aku perlu review pricing strategy kita. Bisa tampilkan daftar semua produk, **diurutkan dari harga termahal ke termurah**? Aku mau lihat range harga kita." Pak Budi memberikan tips: > "Gunakan ORDER BY untuk mengurutkan data. Secara default, urutan dari kecil ke besar (ASC). Untuk kebalikannya, gunakan DESC (descending)." ### Tugas Tampilkan semua produk, diurutkan berdasarkan harga dari **termahal ke termurah** (descending). | Mudah | |
| Top 5 Produk Terlaris ## Laporan Mingguan Meeting mingguan pertamamu! Pak Budi meminta data untuk presentasi ke manajemen: > "Setiap minggu kita perlu laporan **Top 5 Produk Terlaris** berdasarkan jumlah terjual. Ini penting untuk keputusan restocking. Tampilkan 5 produk dengan penjualan tertinggi." > "Kombinasikan ORDER BY yang sudah kamu pelajari dengan LIMIT untuk membatasi jumlah hasil." ### Tugas Tampilkan **5 produk dengan jumlah_terjual tertinggi**, diurutkan dari yang paling laris. | Mudah | |
| Berapa Total Produk Kita? ## Pertanyaan Sederhana tapi Penting Di akhir minggu pertama, CEO TokoNusantara berkunjung ke kantor dan bertanya langsung ke timmu: > "Berapa total produk yang kita jual sekarang di platform?" Pak Budi tersenyum dan berbisik: > "Ini saatnya kamu belajar **fungsi agregasi**. COUNT adalah fungsi untuk menghitung jumlah baris. Sangat berguna untuk pertanyaan 'berapa banyak...?'" ### Tugas Hitung **total jumlah produk** yang ada di tabel produk. Tampilkan hasilnya dengan nama kolom `total_produk`. | Mudah | |
| Ringkasan Penjualan Harian ## Laporan untuk Finance Selamat! Kamu telah menyelesaikan minggu pertamamu di TokoNusantara. Mbak Dewi dari Finance punya satu tugas terakhir sebelum weekend: > "Aku butuh ringkasan penjualan hari ini untuk laporan ke investor. Tolong hitung **total pendapatan** dan **rata-rata nilai transaksi** dari semua pesanan hari ini." Pak Budi memberikan panduan terakhir: > "Ini latihan terakhir SQL dasar! Kamu akan menggabungkan SUM untuk total dan AVG untuk rata-rata dalam satu query. Setelah ini, kamu siap untuk level selanjutnya!" ### Tugas Dari tabel `pesanan_hari_ini`, hitung: 1. **Total pendapatan** (SUM) → tampilkan sebagai `total_pendapatan` 2. **Rata-rata nilai pesanan** (AVG) → tampilkan sebagai `rata_rata_pesanan` | Mudah | |
| Mencari Produk Batik Premium ## Bulan Kedua Dimulai! Selamat! Kamu sudah melewati bulan pertama dengan baik. Sekarang, request data yang masuk makin kompleks. Ibu Sari datang dengan permintaan baru: > "Kita mau fokus promosi produk batik bulan ini. Bisa carikan **semua produk yang namanya diawali dengan kata 'Batik'**? Aku butuh untuk katalog khusus." Pak Budi menjelaskan: > "Untuk pencarian pattern seperti ini, kita pakai **LIKE** dengan **wildcard %**. Tanda % artinya 'karakter apapun, berapapun jumlahnya'." ### Tugas Tampilkan semua produk yang nama_produk-nya **diawali dengan 'Batik'**. | Mudah | |
| Pelanggan dengan Email Gmail Premium ## Integrasi dengan Google Ads Tim Marketing punya project baru: integrasi dengan Google Ads untuk remarketing. > "Untuk tahap awal, kita mau target pelanggan yang pakai **email Gmail** dulu. Bisa carikan semua pelanggan yang emailnya **mengandung 'gmail'**?" Pak Budi menambahkan: > "Kali ini pattern-nya di tengah atau akhir. Pakai % di kedua sisi untuk mencari kata yang ada di mana saja dalam teks." ### Tugas Tampilkan semua pelanggan yang email-nya **mengandung 'gmail'**. | Mudah | |
| Kode Produk Fashion Premium ## Sistem Kode Produk Baru Tim Warehouse baru saja implementasi sistem kode produk baru. Setiap produk punya kode dengan format: - **Huruf pertama**: Kategori (F=Fashion, M=Makanan, A=Aksesoris) - **2 digit angka**: Nomor urut Mas Andi dari Warehouse bertanya: > "Bisa carikan semua produk dengan kode yang **diawali F** (Fashion) dan diikuti **tepat 2 karakter**? Formatnya 'F' + 2 karakter apapun." Pak Budi menjelaskan: > "Kalau butuh **tepat 1 karakter**, pakai underscore (_) bukan %. Jadi pattern-nya 'F__' (F + 2 underscore)." ### Tugas Tampilkan produk dengan kode_produk yang **diawali 'F' dan diikuti tepat 2 karakter** (total 3 karakter). | Sedang | |
| Pelanggan dari Kota-Kota Besar Premium ## Ekspansi ke 5 Kota Besar Meeting strategis pagi ini membahas ekspansi bisnis. Pak Direktur memberikan arahan: > "Kita akan fokus ke **5 kota besar**: Jakarta, Surabaya, Bandung, Medan, dan Makassar. Tolong siapkan data pelanggan dari kota-kota tersebut." Ibu Sari menambahkan: > "Daripada menulis OR berkali-kali, ada cara lebih efisien kan?" Pak Budi tersenyum: > "Betul! Gunakan **IN** operator. Lebih ringkas dan mudah dibaca." ### Tugas Tampilkan pelanggan dari kota **Jakarta, Surabaya, Bandung, Medan, atau Makassar**. | Mudah | |
| Produk Harga Menengah Premium ## Segmentasi Produk Tim Marketing sedang menyusun strategi pricing. Mereka membagi produk jadi 3 segmen: - Budget: < Rp 100.000 - **Menengah: Rp 100.000 - Rp 500.000** - Premium: > Rp 500.000 Ibu Sari meminta: > "Untuk campaign bulan ini, kita fokus ke segmen menengah. Carikan produk dengan harga **antara Rp 100.000 sampai Rp 500.000** (inklusif)." Pak Budi menjelaskan: > "Untuk range nilai, gunakan **BETWEEN**. Lebih elegan daripada pakai >= dan <=." ### Tugas Tampilkan produk dengan harga **antara 100000 dan 500000** (inklusif). | Mudah | |
| Pelanggan Tanpa Nomor Telepon Premium ## Data Cleansing Initiative Tim Customer Success memulai inisiatif untuk melengkapi data pelanggan. Mas Andi meminta bantuanmu: > "Banyak pelanggan yang **belum mengisi nomor telepon**. Bisa carikan siapa saja yang data teleponnya masih kosong? Kita mau hubungi via email untuk minta lengkapi." Pak Budi mengingatkan: > "Di database, data kosong disimpan sebagai **NULL**. Untuk mencarinya, jangan pakai = NULL, tapi **IS NULL**." ### Tugas Tampilkan pelanggan yang **telepon**-nya masih **NULL** (kosong). | Mudah | |
| Pelanggan dengan Data Lengkap Premium ## Campaign SMS Blast Setelah data cleansing, sekarang waktunya action! Tim Marketing mau kirim SMS promo. Ibu Sari meminta: > "Untuk SMS blast, tentunya kita hanya bisa kirim ke pelanggan yang **sudah punya nomor telepon**. Carikan pelanggan yang teleponnya **tidak kosong**." ### Tugas Tampilkan pelanggan yang **telepon**-nya **IS NOT NULL** (sudah terisi). | Mudah | |
| Produk Non-Makanan Premium ## Katalog Produk Non-Food TokoNusantara akan ikut pameran kerajinan. Panitia meminta katalog produk **selain makanan dan minuman**. Mbak Dewi menjelaskan: > "Kita perlu semua produk **KECUALI** yang kategorinya 'Makanan' atau 'Minuman'. Ada cara exclude yang efisien?" Pak Budi menjawab: > "Gunakan **NOT IN** - kebalikan dari IN. Ini akan mengecualikan nilai-nilai dalam list." ### Tugas Tampilkan produk yang kategorinya **BUKAN** 'Makanan' dan **BUKAN** 'Minuman'. | Mudah | |
| Daftar Kategori Produk Premium ## Audit Kategori Produk Tim Product mau melakukan audit struktur kategori. Mereka perlu tahu **kategori apa saja** yang ada di database. > "Jangan tampilkan duplikat ya. Kalau ada 50 produk Fashion, cukup tampilkan 'Fashion' sekali saja." Pak Budi menjelaskan: > "Gunakan **DISTINCT** untuk menghilangkan duplikat. Query akan return nilai unik saja." ### Tugas Tampilkan **daftar kategori unik** dari tabel produk (tanpa duplikat). | Mudah | |
| Laporan Pelanggan Premium Premium ## Final Challenge: Laporan untuk Investor Pak Direktur butuh laporan untuk presentasi ke investor. Permintaannya cukup kompleks: > "Carikan pelanggan dengan kriteria: > 1. Dari kota **Jakarta, Surabaya, atau Bandung** > 2. Total belanja **minimal Rp 2.000.000** > 3. Email **bukan Yahoo** (kita fokus ke Gmail dan lainnya) > 4. **Sudah punya nomor telepon** > > Urutkan dari total belanja tertinggi." Pak Budi tersenyum: > "Ini ujian terakhir SQL Filtering! Kombinasikan semua yang sudah kamu pelajari." ### Tugas Tampilkan pelanggan sesuai kriteria di atas, urutkan dari total_belanja tertinggi. | Sedang | |
| Produk per Kategori Premium ## Bulan Ketiga: Saatnya Analisis! Selamat datang di bulan ketiga! Kamu sudah dipercaya untuk membuat laporan analisis yang lebih mendalam. Pak Budi memberikan tugas pertama: > "Kita perlu tahu **berapa banyak produk di setiap kategori**. Ini penting untuk memahami komposisi katalog kita. Kelompokkan produk berdasarkan kategori dan hitung jumlahnya." > "Untuk mengelompokkan data, gunakan **GROUP BY**. Ini akan menggabungkan baris-baris dengan nilai yang sama." ### Tugas Tampilkan jumlah produk untuk **setiap kategori**. Kolom output: `kategori` dan `jumlah_produk`. | Sedang | |
| Jumlah Pelanggan per Kota Premium ## Analisis Distribusi Pelanggan Tim Marketing ingin memahami distribusi pelanggan untuk strategi ekspansi. Ibu Sari meminta: > "Aku perlu tahu **berapa pelanggan kita di setiap kota**. Urutkan dari yang paling banyak ya, biar aku tahu kota mana yang paling potensial." ### Tugas Hitung jumlah pelanggan per kota, urutkan dari yang **terbanyak**. Kolom output: `kota` dan `jumlah_pelanggan`. | Sedang | |
| Total Penjualan per Kategori Premium ## Laporan Pendapatan per Kategori Mbak Dewi dari Finance butuh data untuk laporan bulanan: > "Tolong hitung **total pendapatan dari setiap kategori produk**. Aku perlu tahu kategori mana yang paling menghasilkan revenue." ### Tugas Hitung total pendapatan (`total_harga`) per kategori produk dari tabel penjualan. Kolom output: `kategori` dan `total_pendapatan`. | Sedang | |
| Rata-rata Harga per Kategori Premium ## Analisis Pricing Strategy Tim Product ingin menganalisis strategi harga: > "Kami perlu tahu **rata-rata harga produk di setiap kategori**. Ini akan membantu kami menentukan positioning produk baru." ### Tugas Hitung rata-rata harga produk per kategori. Kolom output: `kategori` dan `rata_rata_harga`. | Sedang | |
| Statistik Lengkap Penjualan Premium ## Dashboard Statistik Produk Pak Direktur minta ringkasan statistik untuk meeting board: > "Untuk setiap kategori, aku butuh: > - Jumlah produk > - Harga terendah > - Harga tertinggi > - Rata-rata harga > > Semuanya dalam satu laporan yang komprehensif." ### Tugas Tampilkan statistik lengkap per kategori: `kategori`, `jumlah_produk`, `harga_min`, `harga_max`, `harga_rata_rata`. | Sedang | |
| Penjualan per Kota dan Kategori Premium ## Analisis Multi-Dimensi Tim Strategy butuh analisis yang lebih detail: > "Kami perlu tahu **total penjualan untuk setiap kombinasi kota dan kategori**. Ini untuk memahami preferensi produk di tiap region." ### Tugas Hitung total penjualan per kombinasi `kota` dan `kategori`. Kolom output: `kota`, `kategori`, `total_penjualan`. | Sedang | |
| Kategori dengan Penjualan Tinggi Premium ## Filter Hasil Agregasi Mbak Dewi butuh fokus pada kategori yang perform well: > "Tampilkan hanya **kategori yang total penjualannya lebih dari Rp 1.000.000**. Aku mau fokus ke kategori yang sudah menghasilkan." Pak Budi menjelaskan: > "Untuk memfilter HASIL agregasi, gunakan **HAVING** bukan WHERE. WHERE memfilter SEBELUM grouping, HAVING memfilter SESUDAH." ### Tugas Tampilkan kategori dengan total penjualan **lebih dari 1000000**. Kolom: `kategori`, `total_penjualan`. | Sedang | |
| Kota dengan Pelanggan Aktif Banyak Premium ## Kombinasi WHERE dan HAVING Tim Expansion butuh data spesifik: > "Carikan kota yang memiliki **lebih dari 2 pelanggan AKTIF**. Pelanggan aktif adalah yang statusnya 'active'. Kita mau fokus ekspansi di kota dengan base pelanggan aktif yang kuat." ### Tugas Tampilkan kota dengan jumlah pelanggan aktif **lebih dari 2**. Filter status = 'active' dulu, baru hitung dan filter hasilnya. Kolom: `kota`, `jumlah_pelanggan_aktif`. | Sedang | |
| Laporan Penjualan Bulanan Premium ## Tren Penjualan Bulanan Pak Direktur butuh data tren untuk presentasi investor: > "Aku butuh **total penjualan per bulan** untuk melihat tren pertumbuhan kita. Tampilkan bulan dan total penjualannya." Pak Budi memberikan tips: > "Untuk mengekstrak bulan dari tanggal, gunakan fungsi **DATE_TRUNC** atau **EXTRACT**. Kita akan pakai DATE_TRUNC untuk mendapatkan awal bulan." ### Tugas Hitung total penjualan per bulan. Gunakan `DATE_TRUNC('month', tanggal)` untuk grouping. Kolom: `bulan`, `total_penjualan`. | Sedang | |
| Dashboard Executive Premium ## Final Challenge: Dashboard untuk CEO Pak Direktur butuh dashboard lengkap untuk board meeting: > "Buatkan ringkasan per kategori dengan kriteria: > 1. Total transaksi (jumlah penjualan) > 2. Total pendapatan > 3. Rata-rata nilai transaksi > 4. **Hanya kategori dengan total pendapatan > Rp 500.000** > 5. Urutkan dari pendapatan tertinggi" ### Tugas Buat laporan dengan kolom: `kategori`, `total_transaksi`, `total_pendapatan`, `rata_rata_transaksi`. Filter kategori dengan pendapatan > 500000, urutkan descending. | Sedang | |
| Pesanan dengan Nama Pelanggan Premium ## Bulan Keempat: Saatnya Gabungkan Data! Mas Andi dari tim Sales mendatangimu dengan request baru. **Mas Andi:** "Aku punya data pesanan, tapi yang muncul cuma ID pelanggan. Bisa nggak tampilin nama pelanggannya juga? Biar lebih mudah dibaca." Kamu menyadari ini saatnya menggunakan JOIN - teknik untuk menggabungkan data dari tabel berbeda! ### Tugas Tampilkan data pesanan beserta nama pelanggan dengan kolom: - `id_pesanan` - `nama_pelanggan` - `tanggal_pesanan` - `total_harga` Gabungkan tabel `pesanan` dengan tabel `pelanggan` berdasarkan `id_pelanggan`. | Sedang | |
| Detail Pesanan Lengkap Premium ## Laporan Detail untuk Finance Mbak Dewi dari Finance butuh laporan yang lebih detail. **Mbak Dewi:** "Aku butuh data pesanan lengkap - nama pelanggan, nama produk yang dipesan, dan jumlahnya. Bisa dibuat?" Ini artinya kamu harus menggabungkan TIGA tabel sekaligus! ### Tugas Tampilkan detail pesanan dengan kolom: - `id_pesanan` - `nama_pelanggan` - `nama_produk` - `jumlah` - `subtotal` Gabungkan tabel `pesanan`, `pelanggan`, `detail_pesanan`, dan `produk`. | Sedang | |
| Semua Pelanggan dan Pesanannya Premium ## Analisis Database Pelanggan Mas Andi ingin melihat semua pelanggan, termasuk yang belum pernah order. **Mas Andi:** "Aku mau lihat SEMUA pelanggan kita, dan kalau mereka pernah order, tampilkan juga pesanannya. Yang belum pernah order juga harus muncul ya!" INNER JOIN tidak bisa melakukan ini - kamu butuh LEFT JOIN! ### Tugas Tampilkan semua pelanggan beserta pesanan mereka (jika ada) dengan kolom: - `nama_pelanggan` - `kota` - `id_pesanan` - `tanggal_pesanan` Pelanggan yang belum pernah order harus tetap muncul dengan nilai NULL di kolom pesanan. | Sedang | |
| Produk yang Belum Pernah Terjual Premium ## Analisis Inventory Tim Product ingin mengetahui produk mana yang belum pernah terjual sama sekali. **Tim Product:** "Kita punya banyak produk di database. Bisa tolong carikan produk mana saja yang belum pernah ada di pesanan? Kita mau evaluasi apakah produk tersebut perlu di-discontinue." Ini adalah use case klasik untuk LEFT JOIN + IS NULL! ### Tugas Tampilkan produk yang belum pernah terjual dengan kolom: - `id_produk` - `nama_produk` - `harga` - `kategori` Hanya tampilkan produk yang TIDAK ADA di tabel detail_pesanan. | Sedang | |
| Pelanggan Tanpa Pesanan Premium ## Re-engagement Campaign Tim Marketing ingin menghubungi pelanggan yang sudah terdaftar tapi belum pernah order. **Tim Marketing:** "Kami mau kirim promo khusus ke pelanggan yang belum pernah belanja. Bisa tolong carikan datanya? Kali ini coba pakai RIGHT JOIN ya, biar kamu paham bedanya dengan LEFT JOIN." ### Tugas Tampilkan pelanggan yang belum pernah melakukan pesanan dengan kolom: - `id_pelanggan` - `nama` - `email` - `kota` Gunakan RIGHT JOIN dan filter yang tidak memiliki pesanan. | Sedang | |
| Semua Data Gabungan Premium ## Audit Data Lengkap Pak Budi meminta audit lengkap untuk melihat semua data pelanggan dan pesanan. **Pak Budi:** "Ada laporan ada pesanan dengan ID pelanggan yang tidak valid, dan ada pelanggan yang tidak punya pesanan. Bisa tampilkan SEMUA data dari kedua tabel? Yang cocok maupun yang tidak cocok." Ini saatnya menggunakan FULL OUTER JOIN! ### Tugas Tampilkan semua data pelanggan dan pesanan dengan kolom: - `id_pelanggan` (dari pelanggan) - `nama` - `id_pesanan` - `total_harga` Tampilkan SEMUA data - pelanggan tanpa pesanan DAN pesanan tanpa pelanggan valid. | Susah | |
| Kombinasi Produk dan Kategori Premium ## Matrix Produk-Warna Tim Product sedang planning produk baru dengan variasi warna. **Tim Product:** "Kami mau lihat semua kemungkinan kombinasi antara produk dan warna yang tersedia. Setiap produk bisa dibuat dalam semua warna. Bisa buatkan matrixnya?" Ini adalah use case untuk CROSS JOIN - menghasilkan semua kombinasi yang mungkin! ### Tugas Tampilkan semua kombinasi produk dan warna dengan kolom: - `nama_produk` - `warna` Setiap produk harus dipasangkan dengan SETIAP warna yang tersedia. | Sedang | |
| Laporan Penjualan per Kategori Premium ## Laporan untuk Meeting Bulanan Mbak Dewi butuh laporan penjualan yang dikelompokkan per kategori produk. **Mbak Dewi:** "Untuk meeting bulanan, aku butuh ringkasan penjualan per kategori. Berapa total quantity terjual dan total revenue untuk setiap kategori?" Ini kombinasi JOIN dengan agregasi! ### Tugas Tampilkan ringkasan penjualan per kategori dengan kolom: - `kategori` - `total_quantity` - `total_revenue` Urutkan dari revenue tertinggi. | Susah | |
| Top Pelanggan per Kota Premium ## Analisis Top Spender Mas Andi ingin memberikan reward kepada pelanggan terbaik. **Mas Andi:** "Tolong carikan 5 pelanggan dengan total pembelian tertinggi. Tampilkan nama, kota, dan total belanja mereka." ### Tugas Tampilkan top 5 pelanggan berdasarkan total belanja dengan kolom: - `nama_pelanggan` - `kota` - `total_belanja` Urutkan dari total belanja tertinggi dan batasi 5 hasil. | Sedang | |
| Dashboard Penjualan Lengkap Premium ## Executive Dashboard Pak Direktur meminta dashboard komprehensif untuk board meeting. **Pak Direktur:** "Buatkan ringkasan penjualan per kota yang mencakup: berapa pelanggan aktif, berapa pesanan, total revenue, dan rata-rata nilai pesanan. Urutkan dari revenue tertinggi." Ini adalah final challenge - menggabungkan semua yang sudah dipelajari! ### Tugas Buat dashboard penjualan per kota dengan kolom: - `kota` - `jumlah_pelanggan` (pelanggan yang pernah order) - `jumlah_pesanan` - `total_revenue` - `rata_rata_pesanan` Urutkan dari total_revenue tertinggi. | Susah | |
| Produk di Atas Rata-rata Premium ## Bulan Kelima: Saatnya Level Up! Tim Product ingin mengetahui produk-produk premium mereka. **Tim Product:** "Kami mau lihat produk mana saja yang harganya di atas rata-rata. Ini untuk strategi marketing produk premium kita." Untuk menyelesaikan ini, kamu perlu menghitung rata-rata dulu, lalu filter. Tapi bisa dalam SATU query menggunakan subquery! ### Tugas Tampilkan produk dengan harga di atas rata-rata dengan kolom: - `nama_produk` - `kategori` - `harga` Urutkan dari harga tertinggi. | Susah | |
| Pelanggan Top Spender Premium ## Analisis VIP Customer Mas Andi butuh analisis pelanggan untuk program loyalty. **Mas Andi:** "Aku butuh data pelanggan beserta total belanja mereka. Tapi hanya yang total belanjanya di atas 500 ribu ya. Tampilin nama, kota, dan total belanjanya." Kamu perlu menghitung total belanja per pelanggan dulu, baru bisa filter. Subquery di FROM adalah solusinya! ### Tugas Tampilkan pelanggan dengan total belanja > 500000 dengan kolom: - `nama` - `kota` - `total_belanja` Urutkan dari total belanja tertinggi. | Susah | |
| Info Kategori Terlaris Premium ## Enriched Product Report Tim Marketing butuh laporan produk yang diperkaya dengan informasi kategori. **Tim Marketing:** "Untuk setiap produk, aku mau lihat harganya dan juga rata-rata harga di kategori yang sama. Biar bisa bandingin apakah produk itu mahal atau murah dibanding kategorinya." ### Tugas Tampilkan data produk dengan perbandingan harga kategori: - `nama_produk` - `kategori` - `harga` - `avg_harga_kategori` (rata-rata harga di kategori yang sama) Urutkan berdasarkan kategori, lalu harga DESC. | Susah | |
| Pelanggan dengan Pesanan Terbanyak Premium ## Customer Engagement Analysis Pak Budi ingin mengidentifikasi pelanggan paling aktif di setiap kota. **Pak Budi:** "Untuk setiap kota, carikan pelanggan yang punya jumlah pesanan paling banyak. Ini untuk program loyalty regional kita." Ini membutuhkan correlated subquery yang lebih kompleks! ### Tugas Tampilkan pelanggan dengan pesanan terbanyak di kotanya masing-masing: - `nama` - `kota` - `jumlah_pesanan` Hanya tampilkan pelanggan yang jumlah pesanannya = maksimum di kota tersebut. | Susah | |
| Analisis Penjualan Bertahap Premium ## Laporan yang Lebih Readable Mbak Dewi komplain query-mu terlalu susah dibaca. **Mbak Dewi:** "Query kemarin itu pusing bacanya! Bisa nggak dibuat lebih rapi? Aku butuh laporan kategori dengan total penjualan, tapi hanya kategori yang penjualannya di atas rata-rata semua kategori." Saatnya menggunakan CTE (Common Table Expression) - WITH clause! ### Tugas Tampilkan kategori dengan penjualan di atas rata-rata: - `kategori` - `total_penjualan` Gunakan CTE untuk membuat query lebih readable. | Susah | |
| Laporan Multi-Level Premium ## Executive Summary Report Pak Direktur butuh laporan ringkas untuk board meeting. **Pak Direktur:** "Buatkan laporan per kota yang menunjukkan: total pelanggan aktif, total pesanan, total revenue, dan rata-rata revenue per pesanan. Sertakan juga perbandingan dengan rata-rata nasional." Ini butuh beberapa langkah perhitungan - perfect untuk multiple CTE! ### Tugas Buat laporan per kota dengan kolom: - `kota` - `jumlah_pelanggan` - `jumlah_pesanan` - `total_revenue` - `avg_per_pesanan` - `avg_nasional` (rata-rata revenue per pesanan secara nasional) Urutkan dari total revenue tertinggi. | Susah | |
| Ranking Produk Terlaris Premium ## Product Performance Ranking Tim Product ingin ranking produk berdasarkan penjualan. **Tim Product:** "Kami butuh ranking produk berdasarkan jumlah terjual. Tapi ranking-nya per kategori ya, bukan overall. Jadi setiap kategori punya ranking 1, 2, 3 sendiri." Ini adalah use case klasik untuk Window Function - ROW_NUMBER()! ### Tugas Tampilkan ranking produk per kategori dengan kolom: - `kategori` - `nama_produk` - `jumlah_terjual` - `ranking` (ranking dalam kategori tersebut) Urutkan berdasarkan kategori, lalu ranking. | Susah | |
| Perbandingan dengan Rata-rata Premium ## Performance Comparison Mbak Dewi ingin melihat performa setiap pesanan dibandingkan rata-rata. **Mbak Dewi:** "Untuk setiap pesanan, aku mau lihat nilainya dan juga rata-rata pesanan di bulan yang sama. Plus, hitung selisihnya dari rata-rata. Biar bisa identifikasi pesanan yang luar biasa tinggi atau rendah." ### Tugas Tampilkan analisis pesanan dengan kolom: - `id_pesanan` - `tanggal_pesanan` - `total_harga` - `avg_bulan` (rata-rata pesanan di bulan yang sama) - `selisih` (total_harga - avg_bulan) Urutkan berdasarkan tanggal pesanan. | Susah | |
| Pertumbuhan Penjualan Premium ## Month-over-Month Analysis Pak Direktur ingin melihat tren penjualan bulanan. **Pak Direktur:** "Buatkan laporan penjualan bulanan yang menunjukkan pertumbuhan dari bulan sebelumnya. Tampilkan total penjualan, penjualan bulan lalu, dan persentase pertumbuhannya." Ini adalah use case untuk LAG() - mengakses baris sebelumnya! ### Tugas Buat laporan pertumbuhan bulanan dengan kolom: - `bulan` - `total_penjualan` - `penjualan_bulan_lalu` - `pertumbuhan_persen` (persentase pertumbuhan, bulatkan ke integer) Urutkan berdasarkan bulan. | Susah | |
| Dashboard Analytics Lengkap Premium ## Final Challenge: Executive Analytics Dashboard Pak Direktur memberikan tantangan terakhir sebelum kenaikan jabatanmu. **Pak Direktur:** "Buatkan dashboard analytics yang komprehensif untuk setiap pelanggan. Tampilkan: nama pelanggan, total belanja, ranking berdasarkan total belanja, persentase kontribusi terhadap total penjualan, dan status (Top 3 = 'VIP', sisanya = 'Regular')." Ini adalah final boss! Kombinasikan semua yang sudah dipelajari! ### Tugas Buat executive dashboard dengan kolom: - `nama_pelanggan` - `total_belanja` - `ranking` - `kontribusi_persen` (persentase dari total penjualan keseluruhan) - `status` ('VIP' jika ranking <= 3, 'Regular' jika tidak) Urutkan dari ranking terkecil (pelanggan terbaik). | Susah | |
| Klasifikasi Pelanggan Premium ## Bulan ke-6: Tim Business Intelligence Kamu sekarang dipromosikan ke tim Business Intelligence! Tugasmu adalah menganalisis data dan memberikan insight kepada manajemen. ### Tugas Pertama Tim marketing meminta klasifikasi pelanggan berdasarkan total pembelian mereka: - **VIP**: total_purchases >= 5000000 - **Regular**: total_purchases >= 1000000 - **New**: sisanya Buatlah query yang menampilkan nama pelanggan, total pembelian, dan kategori pelanggan. ### Output yang diharapkan | nama_pelanggan | total_purchases | kategori | | Mudah | |
| Status Pengiriman Premium ## Analisis Status Pengiriman Tim operasional membutuhkan dashboard status pengiriman. Mereka ingin mengkategorikan pesanan berdasarkan status pengiriman: - **Delivered**: status = 'delivered' - **In Transit**: status = 'shipped' atau 'in_transit' - **Processing**: status = 'processing' atau 'confirmed' - **Cancelled**: status = 'cancelled' - **Unknown**: status lainnya Buatlah query yang menampilkan order_id, status asli, dan status_label yang lebih mudah dibaca. ### Output yang diharapkan | order_id | status | status_label | | Mudah | |
| Handle Data Kosong Premium ## Laporan dengan Data Lengkap Tim HR membutuhkan laporan karyawan, tapi banyak data yang kosong (NULL). Mereka meminta: 1. Jika **department** kosong, tampilkan 'Belum Ditentukan' 2. Jika **phone** kosong, tampilkan 'Tidak Ada' Buatlah query yang menampilkan nama, department (dengan default), dan phone (dengan default). ### Output yang diharapkan | nama | department | phone | | Mudah | |
| Hitung Rata-rata Penjualan Premium ## Analisis Performa Sales Tim sales ingin menghitung rata-rata penjualan per kunjungan untuk setiap sales person. Rumusnya: ``` rata_rata = total_sales / total_visits ``` **Masalah:** Ada sales yang belum melakukan kunjungan (total_visits = 0), yang akan menyebabkan error division by zero! Gunakan NULLIF untuk handle kasus ini. Jika hasilnya NULL, tampilkan 0. ### Output yang diharapkan | nama_sales | total_sales | total_visits | rata_rata_per_visit | | Sedang | |
| Pivot Penjualan per Status Premium ## Laporan Pivot Penjualan CFO membutuhkan laporan yang menunjukkan breakdown penjualan per kategori produk, dipecah berdasarkan status order: - Total nilai order yang **completed** - Total nilai order yang **pending** - Total nilai order yang **cancelled** Semua dalam satu baris per kategori! ### Output yang diharapkan | kategori | completed_sales | pending_sales | cancelled_sales | | Sedang | |
| Prioritas Tiket Support Premium ## Sistem Prioritas Tiket Tim customer support membutuhkan daftar tiket yang diurutkan berdasarkan prioritas custom: 1. **critical** - harus di atas 2. **high** - kedua 3. **medium** - ketiga 4. **low** - terakhir Dalam setiap level prioritas, urutkan berdasarkan created_at (yang paling lama dulu). ### Output yang diharapkan | ticket_id | subject | priority | created_at | | Sedang | |
| Lead Scoring System Premium ## Implementasi Lead Scoring Tim marketing ingin mengimplementasikan lead scoring untuk prioritas follow-up. Aturan scoring: **Engagement Score:** - page_views >= 50: +30 poin - page_views >= 20: +15 poin - page_views >= 5: +5 poin **Recency Score:** - last_visit dalam 7 hari terakhir: +25 poin - last_visit dalam 30 hari terakhir: +10 poin **Profile Score:** - has_email = true: +20 poin Hitung total score dan urutkan dari tertinggi. *Note: Gunakan CURRENT_DATE untuk perhitungan tanggal* ### Output yang diharapkan | lead_name | page_views | last_visit | has_email | total_score | | Susah | |
| Analisis Distribusi Harga Premium ## Distribusi Harga Produk Tim pricing ingin menganalisis distribusi produk berdasarkan range harga: - **Budget**: harga < 100000 - **Mid-Range**: harga >= 100000 AND < 500000 - **Premium**: harga >= 500000 AND < 2000000 - **Luxury**: harga >= 2000000 Hitung jumlah produk dan total nilai inventory di setiap bucket. ### Output yang diharapkan | price_range | jumlah_produk | total_inventory_value | | Sedang | |
| Audit Kualitas Data Premium ## Data Quality Dashboard Tim data engineering membutuhkan audit kualitas data pelanggan. Untuk setiap pelanggan, tandai status kelengkapan data: - **Complete**: semua field terisi (name, email, phone, address tidak NULL) - **Partial**: hanya name dan email terisi - **Incomplete**: sisanya Hitung juga completeness_score (jumlah field yang terisi dari 4). ### Output yang diharapkan | id | name | data_status | completeness_score | | Susah | |
| Executive Dashboard Premium ## Laporan Eksekutif Bulanan CEO membutuhkan dashboard ringkasan performa bulanan. Buatlah laporan dengan kolom: 1. **bulan**: nama bulan 2. **total_orders**: jumlah order 3. **total_revenue**: total pendapatan 4. **avg_order_value**: rata-rata nilai order 5. **fulfillment_rate**: persentase order completed (format: angka tanpa %) 6. **performance_status**: - 'Excellent' jika total_revenue >= 50000000 DAN fulfillment_rate >= 90 - 'Good' jika total_revenue >= 30000000 - 'Needs Improvement' sisanya ### Output yang diharapkan | bulan | total_orders | total_revenue | avg_order_value | fulfillment_rate | performance_status | | Susah | |
| Analisis Pola Waktu Order Premium ## Bulan ke-7: Time Series Analysis Selamat! Kamu sekarang menangani analisis time series. Tugas pertamamu adalah menganalisis pola waktu order untuk tim operations. ### Tugas Ekstrak informasi waktu dari setiap order: - Tahun order - Bulan order (angka) - Hari dalam minggu (1=Senin, 7=Minggu) - Jam order **Output yang diharapkan:** order_id, order_time, tahun, bulan, hari_minggu, jam | Mudah | |
| Laporan Penjualan Mingguan Premium ## Agregasi per Minggu Finance membutuhkan laporan penjualan yang diagregasi per minggu. Gunakan DATE_TRUNC untuk memotong tanggal ke awal minggu. ### Tugas Buatlah laporan yang menampilkan: - Awal minggu (tanggal Senin) - Total penjualan minggu tersebut - Jumlah transaksi **Output yang diharapkan:** minggu, total_penjualan, jumlah_transaksi | Mudah | |
| Pelanggan Aktif 30 Hari Premium ## Identifikasi Pelanggan Aktif Tim CRM ingin mengidentifikasi pelanggan yang aktif dalam 30 hari terakhir untuk campaign retention. ### Tugas Tampilkan pelanggan yang last_order_date-nya dalam 30 hari terakhir dari tanggal hari ini. **Output yang diharapkan:** nama_pelanggan, last_order_date, days_since_order *Hint: Gunakan CURRENT_DATE dan INTERVAL* | Mudah | |
| Tenure Karyawan Premium ## Analisis Tenure Karyawan HR membutuhkan laporan tenure (masa kerja) karyawan. Hitung berapa lama setiap karyawan sudah bekerja. ### Tugas Tampilkan nama karyawan, tanggal bergabung, dan tenure dalam format yang mudah dibaca. Urutkan dari yang paling senior. **Output yang diharapkan:** nama, hire_date, tenure | Sedang | |
| Laporan Q1 2024 Premium ## Laporan Kuartal Finance membutuhkan laporan penjualan Q1 2024 (Januari - Maret). ### Tugas Tampilkan semua transaksi di Q1 2024 dengan total per bulan. **Output yang diharapkan:** bulan, total_transaksi, total_revenue | Sedang | |
| Analisis Peak Hours Premium ## Identifikasi Peak Hours Tim operations ingin tahu jam-jam sibuk untuk mengoptimalkan staffing. Analisis traffic berdasarkan jam. ### Tugas Kelompokkan aktivitas berdasarkan jam dan hitung: - Total events per jam - Klasifikasi: 'Peak' jika > 50 events, 'Normal' jika > 20, 'Low' sisanya **Output yang diharapkan:** jam, total_events, traffic_level | Sedang | |
| Analisis Penjualan per Hari Premium ## Pola Penjualan Mingguan Marketing ingin tahu hari apa yang paling banyak penjualan untuk scheduling promo. ### Tugas Analisis penjualan berdasarkan hari dalam minggu: - Nama hari (Senin, Selasa, dst) - Total transaksi - Total revenue - Rata-rata per transaksi Urutkan dari Senin ke Minggu. **Output yang diharapkan:** nama_hari, total_transaksi, total_revenue, avg_per_transaksi | Sedang | |
| Pertumbuhan Bulanan Premium ## Month-over-Month Analysis CFO ingin melihat pertumbuhan revenue bulan ke bulan. Hitung revenue per bulan dan bandingkan dengan bulan sebelumnya. ### Tugas Buatlah laporan yang menampilkan: - Bulan - Revenue bulan ini - Revenue bulan sebelumnya - Growth percentage **Output yang diharapkan:** bulan, revenue, prev_month_revenue, growth_pct *Hint: Gunakan LAG window function* | Susah | |
| Format Tanggal Indonesia Premium ## Laporan dengan Format Tanggal Indonesia Tim membutuhkan laporan dengan format tanggal yang familiar untuk stakeholder Indonesia. ### Tugas Tampilkan invoice dengan format tanggal Indonesia: - **tanggal_invoice**: format "DD Bulan YYYY" (contoh: "15 Maret 2024") - **waktu_invoice**: format "HH:MI" (contoh: "14:30") **Output yang diharapkan:** invoice_id, tanggal_invoice, waktu_invoice, total_amount | Sedang | |
| Dashboard Time Series Premium ## Dashboard Analisis Waktu Komprehensif CEO membutuhkan dashboard yang menunjukkan pola aktivitas berdasarkan waktu. Buatlah laporan yang mengelompokkan aktivitas ke dalam: **Time Slots:** - 'Morning' (06:00-11:59) - 'Afternoon' (12:00-17:59) - 'Evening' (18:00-23:59) - 'Night' (00:00-05:59) Untuk setiap time slot, hitung: - Total events - Total revenue - Rata-rata revenue per event - Persentase dari total events **Output yang diharapkan:** time_slot, total_events, total_revenue, avg_revenue, pct_of_total | Susah | |
| Nama Lengkap Pelanggan Premium ## Bulan ke-8: Data Transformation Selamat datang di tim Data Transformation! Tugasmu adalah memastikan data bersih dan siap pakai untuk berbagai keperluan. ### Tugas Pertama Database menyimpan nama depan dan nama belakang secara terpisah. Tim marketing membutuhkan nama lengkap dalam satu kolom untuk personalized email. Buatlah query yang menampilkan nama lengkap dengan format "Nama_Depan Nama_Belakang". **Output yang diharapkan:** id, nama_lengkap, email | Mudah | |
| Standarisasi Kode Produk Premium ## Standarisasi Data Kode produk di database tidak konsisten - ada yang uppercase, lowercase, dan mixed case. Ini menyulitkan pencarian dan matching. ### Tugas Buatlah query yang menampilkan: - Kode produk asli - Kode produk dalam UPPERCASE (untuk sistem inventory) - Nama produk dalam lowercase (untuk URL slug) **Output yang diharapkan:** product_code, code_upper, name_lower | Mudah | |
| Bersihkan Data Input Premium ## Data Cleaning: Whitespace User sering memasukkan data dengan spasi berlebih di awal atau akhir. Ini menyebabkan masalah saat matching dan display. ### Tugas Bersihkan data pelanggan: - Hapus spasi di awal dan akhir nama - Hapus spasi di awal dan akhir email - Tampilkan panjang string sebelum dan sesudah cleaning **Output yang diharapkan:** nama_bersih, email_bersih, len_before, len_after | Mudah | |
| Parsing Kode Invoice Premium ## Ekstraksi Data dari Kode Format invoice code adalah: "INV-YYYY-MMDD-XXXX" - INV: prefix - YYYY: tahun - MMDD: bulan dan tanggal - XXXX: nomor urut Contoh: "INV-2024-0315-0001" ### Tugas Ekstrak komponen dari invoice code: - Tahun (4 digit setelah "INV-") - Bulan (2 digit setelah tahun) - Nomor urut (4 digit terakhir) **Output yang diharapkan:** invoice_code, tahun, bulan, nomor_urut | Sedang | |
| Format Nomor Telepon Premium ## Standarisasi Nomor Telepon Nomor telepon di database memiliki format yang tidak konsisten: - Ada yang pakai spasi: "0812 3456 7890" - Ada yang pakai strip: "0812-3456-7890" - Ada yang tanpa separator: "081234567890" ### Tugas Buatlah query yang: 1. Menampilkan nomor asli 2. Menghapus semua spasi dan strip (clean format) 3. Format dengan prefix +62 (ganti 08 di awal dengan +628) **Output yang diharapkan:** phone_original, phone_clean, phone_international | Sedang | |
| Parsing Alamat Email Premium ## Ekstraksi Domain Email Tim marketing ingin menganalisis domain email pelanggan untuk segmentasi (corporate vs personal email). ### Tugas Dari alamat email, ekstrak: 1. Username (bagian sebelum @) 2. Domain (bagian setelah @) 3. TLD/extension (bagian setelah titik terakhir) **Output yang diharapkan:** email, username, domain, tld | Sedang | |
| Validasi Format Data Premium ## Validasi Format Tim QA perlu memvalidasi format data produk. Setiap product code harus mengandung tanda "-" sebagai separator. ### Tugas Buatlah query yang: 1. Menemukan posisi karakter "-" dalam kode produk 2. Menandai valid/invalid (valid jika ada "-") 3. Ekstrak prefix (bagian sebelum "-" pertama) **Output yang diharapkan:** product_code, dash_position, is_valid, prefix | Sedang | |
| Format Nomor Urut Premium ## Padding untuk Konsistensi Nomor invoice perlu diformat dengan padding: - Nomor urut harus 6 digit (pakai leading zeros) - Format akhir: "INV-" + tahun + "-" + nomor_urut_padded Contoh: nomor 42 di tahun 2024 → "INV-2024-000042" ### Tugas Buatlah query yang menampilkan: - Nomor urut asli - Nomor dengan padding 6 digit - Invoice code lengkap **Output yang diharapkan:** invoice_number, padded_number, full_invoice_code | Sedang | |
| Ekstraksi dengan Regex Premium ## Advanced Parsing dengan Regex Data log memiliki format yang kompleks: "[LEVEL] YYYY-MM-DD HH:MI:SS - Message" Contoh: "[ERROR] 2024-03-15 14:30:45 - Database connection failed" ### Tugas Ekstrak komponen: 1. Log level (ERROR, WARN, INFO) 2. Tanggal (format YYYY-MM-DD) 3. Message (setelah " - ") **Output yang diharapkan:** log_entry, log_level, log_date, message | Susah | |
| Data Transformation Pipeline Premium ## Comprehensive Data Cleaning Timmu mendapat raw data dari berbagai source yang perlu dibersihkan sebelum dimasukkan ke data warehouse. ### Tugas Buatlah query yang mentransformasi raw data: 1. **clean_name**: Trim, lalu Proper Case (huruf pertama kapital) 2. **clean_email**: Trim, lalu lowercase 3. **clean_phone**: Hapus semua non-digit, format +62 4. **status_label**: Jika email valid (ada @), "Active", else "Incomplete" 5. **data_quality_score**: 1 point per field yang tidak kosong (max 3) **Output yang diharapkan:** clean_name, clean_email, clean_phone, status_label, data_quality_score | Susah | |
| Pembulatan Harga Premium ## Bulan ke-9: Financial Analytics Selamat datang di tim Finance! Kamu akan banyak bekerja dengan angka dan kalkulasi finansial. ### Tugas Pertama Tim pricing perlu menampilkan harga dengan pembulatan yang rapi: - Harga asli (decimal) - Harga dibulatkan ke bilangan bulat - Harga dibulatkan ke 2 decimal - Harga dibulatkan ke ribuan (nearest thousand) **Output yang diharapkan:** product_name, original_price, rounded_int, rounded_2dec, rounded_thousand | Mudah | |
| Estimasi Pengiriman Premium ## Kalkulasi Kuantitas Tim logistics perlu menghitung kebutuhan box untuk pengiriman: - Setiap box dapat menampung 12 unit - Hitung berapa box yang dibutuhkan (selalu bulatkan ke atas!) - Hitung sisa unit jika menggunakan box penuh ### Tugas Untuk setiap order, tampilkan: - Jumlah unit - Rata-rata unit per box jika dibagi sempurna - Jumlah box yang dibutuhkan (bulatkan ke atas) - Kapasitas terbuang (box * 12 - units) **Output yang diharapkan:** order_id, units, avg_per_box, boxes_needed, wasted_capacity | Mudah | |
| Pembagian Bonus Premium ## Distribusi Bonus Karyawan HR ingin mendistribusikan bonus dengan aturan: - Total bonus dibagi rata ke semua karyawan - Sisa yang tidak bisa dibagi akan disimpan untuk bulan depan ### Tugas Dengan total bonus pool Rp 50.000.000 untuk 7 karyawan: - Hitung bonus per orang (pembulatan ke bawah) - Hitung sisa bonus - Identifikasi employee dengan ID genap untuk special bonus **Output yang diharapkan:** employee_id, nama, bonus_per_orang, is_even_id | Mudah | |
| Analisis Variance Budget Premium ## Budget vs Actual Analysis Finance perlu menganalisis variance antara budget dan actual spending: - Variance bisa positif (under budget) atau negatif (over budget) - Untuk ranking, gunakan nilai absolut variance ### Tugas Buatlah laporan yang menampilkan: - Department - Budget dan actual - Variance (actual - budget) - Absolute variance - Status (Over Budget / Under Budget / On Track) Urutkan dari variance terbesar. **Output yang diharapkan:** department, budget, actual, variance, abs_variance, status | Sedang | |
| Compound Interest Calculator Premium ## Kalkulasi Investasi Tim investment membutuhkan kalkulasi compound interest untuk berbagai produk investasi. Rumus compound interest: ``` Future Value = Principal * (1 + rate)^years ``` ### Tugas Hitung future value untuk setiap investasi setelah periode yang ditentukan: - Principal (nilai awal) - Interest rate (per tahun) - Years (durasi) - Future value (hasil akhir) - Total interest earned **Output yang diharapkan:** investment_name, principal, rate, years, future_value, interest_earned | Sedang | |
| Profit Margin Analysis Premium ## Analisis Margin Keuntungan Tim finance perlu menganalisis profitabilitas setiap produk: ### Formula - Profit = Revenue - Cost - Profit Margin (%) = (Profit / Revenue) * 100 - Cost Ratio (%) = (Cost / Revenue) * 100 ### Tugas Hitung metrics profitabilitas untuk setiap produk: - Revenue dan cost - Profit (angka) - Profit margin (persentase dengan 2 decimal) - Cost ratio (persentase dengan 2 decimal) Urutkan dari margin tertinggi. **Output yang diharapkan:** product_name, revenue, cost, profit, profit_margin, cost_ratio | Sedang | |
| Salary Adjustment Premium ## Penyesuaian Gaji HR membuat kebijakan salary adjustment: - Minimum salary: Rp 5.000.000 - Maximum salary cap: Rp 30.000.000 - Proposed raise: 15% ### Tugas Hitung adjusted salary dengan aturan: 1. Proposed salary = current * 1.15 (raise 15%) 2. Adjusted salary = MAX(proposed, 5000000) — tidak boleh kurang dari minimum 3. Final salary = MIN(adjusted, 30000000) — tidak boleh lebih dari cap **Output yang diharapkan:** nama, current_salary, proposed_salary, final_salary | Sedang | |
| CAGR Calculator Premium ## Compound Annual Growth Rate Tim investor relations perlu menghitung CAGR (Compound Annual Growth Rate) untuk berbagai metrik bisnis. Formula CAGR: ``` CAGR = (End Value / Start Value)^(1/years) - 1 ``` Alternatif dengan LOG: ``` CAGR = EXP(LN(End / Start) / years) - 1 ``` ### Tugas Hitung CAGR revenue untuk setiap business unit. **Output yang diharapkan:** business_unit, start_revenue, end_revenue, years, cagr_percent | Susah | |
| Sales Statistics Premium ## Analisis Statistik Penjualan Tim analytics membutuhkan summary statistics untuk setiap kategori produk: ### Tugas Hitung untuk setiap kategori: - Jumlah produk - Total sales - Average sales - Min & Max sales - Standard deviation (untuk mengukur variabilitas) - Coefficient of variation (stddev/avg * 100) — untuk compare variability across categories **Output yang diharapkan:** kategori, count, total_sales, avg_sales, min_sales, max_sales, stddev_sales, cv_percent | Susah | |
| Financial KPI Dashboard Premium ## Comprehensive Financial Dashboard CFO membutuhkan dashboard KPI finansial bulanan dengan metrics: 1. **revenue_growth**: % perubahan dari bulan sebelumnya 2. **expense_ratio**: expenses / revenue * 100 3. **profit_margin**: (revenue - expenses) / revenue * 100 4. **runway_months**: cash_balance / monthly_burn_rate 5. **health_status**: - "Excellent" jika profit_margin > 30 AND expense_ratio < 60 - "Good" jika profit_margin > 15 - "Warning" jika profit_margin > 0 - "Critical" jika profit_margin <= 0 **Output yang diharapkan:** bulan, revenue, expenses, profit_margin, expense_ratio, runway_months, health_status | Susah | |
| Menemukan Data Duplikat Premium ## Bulan ke-10: Data Quality Team Selamat! Kamu sekarang di tim Data Quality. Tugasmu memastikan data bersih dan akurat. ### Tugas Pertama: Identifikasi Duplikat Database pelanggan memiliki kemungkinan duplikat. Identifikasi email yang muncul lebih dari sekali. Tampilkan: - Email yang duplikat - Berapa kali muncul - ID pelanggan yang menggunakan email tersebut (kumpulkan dalam satu string) **Output yang diharapkan:** email, occurrence_count, customer_ids | Mudah | |
| Deduplikasi - Simpan yang Pertama Premium ## Deduplikasi Data Setelah menemukan duplikat, sekarang saatnya membersihkan. Strategi: simpan record pertama (ID terkecil), hapus sisanya. ### Tugas Buatlah query yang menampilkan data yang BUKAN duplikat (data bersih). Untuk setiap email yang duplikat, hanya tampilkan record dengan customer_id terkecil. **Output yang diharapkan:** customer_id, nama, email, phone | Sedang | |
| Validasi Format Email & Phone Premium ## Validasi Format Data Sebelum data masuk ke production, validasi formatnya: ### Rules - **Email valid**: harus mengandung @ dan . - **Phone valid**: harus dimulai dengan 08 dan panjang 10-13 digit ### Tugas Buatlah laporan validasi yang menampilkan: - Data pelanggan - email_valid (Yes/No) - phone_valid (Yes/No) - overall_status (Valid jika keduanya valid, Invalid jika tidak) **Output yang diharapkan:** nama, email, phone, email_valid, phone_valid, overall_status | Sedang | |
| Mengisi Data Kosong Premium ## Handle Missing Values Data sering memiliki nilai kosong (NULL atau empty string). Kita perlu strategi untuk mengatasinya. ### Tugas Buatlah query yang mengisi missing values: 1. Jika **department** NULL → isi dengan 'Unassigned' 2. Jika **salary** NULL → isi dengan rata-rata salary dari department yang sama 3. Jika tidak ada rata-rata department → isi dengan rata-rata global **Output yang diharapkan:** nama, department, original_salary, filled_salary | Susah | |
| Standarisasi Nama Kota Premium ## Standarisasi Data Kategorikal Data kota dari berbagai sumber memiliki format berbeda: - "jakarta" vs "Jakarta" vs "JAKARTA" - "jkt" vs "jak" (abbreviations) - "Jakarta Selatan" vs "Jaksel" ### Tugas Buatlah mapping untuk standarisasi nama kota: 1. Trim whitespace 2. Convert to proper case (huruf pertama kapital) 3. Map abbreviations ke nama standar: - jkt, jak → Jakarta - sby → Surabaya - bdg → Bandung **Output yang diharapkan:** original_city, standardized_city | Sedang | |
| Deteksi Outlier Premium ## Deteksi Nilai Anomali Data transaksi perlu dicek untuk outliers yang mungkin merupakan error atau fraud. ### Metode: IQR (Interquartile Range) - Q1 = 25th percentile - Q3 = 75th percentile - IQR = Q3 - Q1 - Lower bound = Q1 - 1.5 * IQR - Upper bound = Q3 + 1.5 * IQR ### Tugas Identifikasi transaksi yang outlier (di luar bounds). **Output yang diharapkan:** transaction_id, amount, is_outlier, outlier_type | Susah | |
| Konversi dan Pembersihan Tipe Data Premium ## Data Type Cleanup Data dari CSV import sering masuk sebagai text. Kita perlu convert ke tipe yang benar. ### Data Issues - Price masuk sebagai text dengan format "Rp 1.500.000" - Quantity masuk sebagai text "10 pcs" - Date masuk sebagai text "15/03/2024" ### Tugas Bersihkan dan convert: 1. **clean_price**: Ekstrak angka, convert ke BIGINT 2. **clean_quantity**: Ekstrak angka, convert ke INT 3. **clean_date**: Convert ke DATE format 4. **total_value**: price * quantity **Output yang diharapkan:** product_name, clean_price, clean_quantity, clean_date, total_value | Susah | |
| Validasi Antar Kolom Premium ## Cross-Field Validation Beberapa validasi membutuhkan perbandingan antar kolom: ### Rules 1. **end_date** harus >= **start_date** 2. **discount_price** harus < **original_price** 3. Jika **status** = 'completed', **end_date** tidak boleh NULL 4. **total_amount** harus = **quantity** * **unit_price** ### Tugas Identifikasi records yang melanggar satu atau lebih rules. **Output yang diharapkan:** order_id, validation_errors, error_count | Susah | |
| Data Profiling Report Premium ## Data Profiling Buatlah profiling report untuk memahami karakteristik data. ### Tugas Untuk kolom **amount** dalam tabel transaksi, hitung: 1. **total_rows**: Jumlah total records 2. **null_count**: Jumlah NULL values 3. **null_pct**: Persentase NULL 4. **distinct_count**: Jumlah nilai unik 5. **min_value**: Nilai minimum 6. **max_value**: Nilai maksimum 7. **avg_value**: Rata-rata 8. **median_value**: Median **Output yang diharapkan:** total_rows, null_count, null_pct, distinct_count, min_value, max_value, avg_value, median_value | Sedang | |
| Data Quality Dashboard Premium ## Comprehensive Data Quality Assessment Buatlah dashboard yang mengevaluasi overall data quality dengan scoring system. ### Metrics 1. **completeness_score**: 100 - (avg null percentage across key fields) 2. **validity_score**: percentage of records passing all validations 3. **uniqueness_score**: percentage of unique emails 4. **consistency_score**: percentage of standardized city names 5. **overall_quality_score**: weighted average (completeness: 30%, validity: 30%, uniqueness: 20%, consistency: 20%) 6. **quality_grade**: A (>=90), B (>=80), C (>=70), D (>=60), F (<60) **Output yang diharapkan:** completeness_score, validity_score, uniqueness_score, consistency_score, overall_quality_score, quality_grade | Susah |