Dua proyek sebelumnya mengisi database dari dalam: katalog perpustakaan lewat INSERT, pencatat keuangan lewat modul sqlite3 Python. Di dunia nyata, analisis sering bergerak dari arah sebaliknya — data sudah lebih dulu hidup di tempat lain. Aplikasi kasir mencatat setiap transaksi, lalu mengekspor riwayatnya sebagai berkas CSV. Pekerjaan kita pada proyek ini adalah memindahkan data itu ke SQLite, menjawab pertanyaan bisnis dengan query, lalu mengirim hasilnya kembali keluar sebagai berkas untuk spreadsheet dan program lain.

Studi kasusnya sebuah toko sembako kecil dengan delapan produk pada tiga kategori: Makanan, Minuman, dan Rumah Tangga. Pemilik toko memegang laporan mentah berisi 60 transaksi semester I 2025 (Januari sampai Juni) dan bertanya hal-hal khas pemilik usaha: berapa omzet tiap bulan dan seberapa cepat pertumbuhannya, produk mana yang menopang pendapatan, seberapa besar pangsa tiap kategori, dan ringkasan apa yang pantas naik ke laporan akhir.

Alur kerja proyek dirangkum dalam lima berkas yang dibangun bertahap:

  • schema.sql — dua tabel (produk dan penjualan) dengan CHECK, foreign key, dua index, plus data master delapan produk,
  • data_penjualan.csv — 60 baris transaksi semester I 2025,
  • import.sql — alur .import beserta verifikasi jumlah, tipe, dan konsistensi angka,
  • analisis.sql — tujuh query analisis, dari omzet bulanan sampai statistik harian,
  • laporan.sql — laporan akhir sekali jalan plus eksport ke CSV dan JSON.

Hasil Akhir #

Satu perintah sqlite3 penjualan.db < laporan.sql mencetak laporan lengkap ke layar sekaligus menulis dua berkas hasil: laporan-omzet.csv untuk dibuka di spreadsheet dan laporan-produk.json untuk dikonsumsi program lain. Berikut potongan dua bagian pertama dari laporan tersebut:

text
===== LAPORAN PENJUALAN - SEMESTER I 2025 =====

--- Ringkasan ---
transaksi  hari_aktif  item_terjual  total_omzet
---------  ----------  ------------  -----------
60         48          193           6074000    

--- Omzet Bulanan dan Pertumbuhan ---
bulan    transaksi  omzet    pertumbuhan_persen
-------  ---------  -------  ------------------
2025-01  10         859000                     
2025-02  10         958000   11.5              
2025-03  10         1006000  5.0               
2025-04  10         1062000  5.6               
2025-05  10         1019000  -4.0              
2025-06  10         1170000  14.8              

Angka-angka di atas adalah hasil nyata dari data latihan proyek ini: 60 transaksi pada 48 hari aktif menghasilkan omzet Rp6.074.000, dengan satu-satunya penurunan terjadi pada Mei sebelum naik kembali di Juni. Bagaimana setiap angka itu dihitung — dan mengapa bisa dipercaya — adalah isi empat bagian proyek.

Tujuan Pembelajaran #

Setelah menyelesaikan proyek ini, kita mampu:

  • merancang skema analisis dua tabel dengan foreign key, CHECK (termasuk validasi format tanggal), dan index yang dipilih dari pola akses,
  • mengimpor CSV ke tabel yang skemanya sudah kita kendalikan dengan .import --csv --skip 1, lalu memverifikasi jumlah baris, tipe kolom, dan konsistensi angka,
  • menjawab pertanyaan bisnis dengan GROUP BY, JOIN, LIMIT, dan fungsi tanggal strftime(),
  • memakai window functions — SUM() OVER, RANK() OVER PARTITION BY, dan LAG() — untuk omzet kumulatif, peringkat produk, dan pertumbuhan bulan-ke-bulan,
  • merakit laporan sekali jalan dengan CREATE TEMP VIEW, .print, .headers, dan .mode, lalu mengekspor hasilnya ke CSV dan JSON.

Prasyarat #

Proyek ini tidak memperkenalkan materi baru, melainkan memakai materi yang sudah dibahas. Chapter yang paling sering dirujuk:

  • Export dan Import Data — .mode, .once, .import, dan jebakan type affinity; Bagian 2 dan Bagian 4 memakainya langsung,
  • Fungsi Agregat serta Mengelompokan Hasil dengan GROUP BY dan HAVING — SUM(), COUNT(), AVG(), ROUND() untuk seluruh analisis,
  • Menggabungkan Tabel dengan JOIN — menggabungkan penjualan ke produk,
  • Window Functions — SUM() OVER, RANK(), dan LAG(),
  • Common Table Expressions — menyusun query bertahap yang mudah dibaca,
  • Bekerja dengan Tanggal dan Waktu — strftime() dan date(),
  • Constraint pada Tabel, Foreign Key, dan Index dan Pencarian Cepat — materi inti Bagian 1,
  • Dot Commands pada sqlite3 CLI — .print, .headers, .mode, .tables, .once.

Tahapan Pengerjaan #

Proyek dikerjakan dalam empat bagian berurutan. Setiap bagian menghasilkan database yang bisa dipakai penuh:

  1. Bagian 1: Menyiapkan Skema — merancang tabel produk dan penjualan, memilih constraint dan index, menulis schema.sql berikut data master delapan produk, lalu membuktikan penegakannya bekerja.
  2. Bagian 2: Import Data CSV — mengimpor 60 baris data_penjualan.csv dengan .import, lalu memverifikasi jumlah, tipe, dan konsistensi angkanya.
  3. Bagian 3: Query Analisis — menyusun tujuh query dalam analisis.sql: omzet bulanan, produk teratas, pangsa kategori, omzet kumulatif, peringkat produk per kategori, pertumbuhan bulanan, dan statistik harian.
  4. Bagian 4: Laporan dan Eksport — merakit laporan.sql dengan temp view, mencetak laporan akhir, mengekspor ke CSV dan JSON, lalu menguji seluruh alur dari nol.

Mulailah dari Bagian 1 dan ikuti urutannya karena setiap bagian dibangun di atas berkas bagian sebelumnya.

Berkas Sumber #

Berkas sumber setiap bagian tersedia pada bagian Berkas Sumber di bawah halaman bagian yang bersangkutan. Daftarnya kumulatif: Bagian 2 memuat schema.sql, data_penjualan.csv, dan import.sql; Bagian 3 menambahkan analisis.sql; Bagian 4 memuat kelima berkas sekaligus — keadaan lengkap proyek pada tahap tersebut. Nama database yang dipakai di seluruh proyek adalah penjualan.db.