Dalam dunia sistem informasi pemerintahan, khususnya dalam pengelolaan anggaran, kita sering dihadapkan pada data yang tersebar di banyak tabel. Artikel ini akan membedah sebuah query SQL kompleks yang mengambil data anggaran berdasarkan program, kegiatan, hingga sumber dan rincian belanja.
🎯 Tujuan Query
Query ini digunakan untuk menampilkan data anggaran sub kegiatan berdasarkan tahun anggaran, kode organisasi, program, kegiatan, rekening, satuan, pagu, hingga sumber dana yang terkait.
🧱 Struktur Umum Query
1. Tabel Utama: ta_rask_arsip a
Tabel ini adalah sumber utama (alias a) yang berisi data anggaran. Semua penggabungan (join) mengacu padanya.
2. Inner Join – Data Pokok Referensi
Digunakan untuk mengambil nama atau deskripsi dari berbagai kode:
- ref_urusan, ref_bidang: menjelaskan kode urusan dan bidang.
- ta_program, ta_kegiatan, ta_sub_kegiatan: menjelaskan program hingga sub kegiatan.
- ta_sub_opd: mengambil nama sub OPD.
3. Left Join – Referensi Opsional
Berguna saat data sumber dana tidak lengkap:
- ref_sumber_dana_3 hingga ref_sumber_dana_6: menangani variasi sumber dana dengan CASE.
- ref_rek_6: untuk mendapatkan nama rekening berdasarkan kode lengkap.
🔁 JOIN Statement Penting
Bagian ini menjamin data program yang diambil relevan terhadap tahun, OPD, sub OPD, hingga kode urusan dan bidang.
INNER JOIN prod_anggaran.dbo.ta_program d ON a.tahun = d.tahun AND a.kd_opd = d.kd_opd AND a.kd_sub_opd = d.kd_sub_opd AND a.kd_urusan = d.kd_urusan AND a.kd_bidang = d.kd_bidang AND a.kd_program = d.kd_program
🧠 CASE Statement – Mengidentifikasi Sumber Dana
CASE
WHEN a.kd_sumber_dana_4=0 OR a.kd_sumber_dana_4 IS NULL THEN j.nm_sd_3
WHEN a.kd_sumber_dana_5=0 OR a.kd_sumber_dana_5 IS NULL THEN i.nm_sd_4
WHEN a.kd_sumber_dana_6=0 OR a.kd_sumber_dana_6 IS NULL THEN h.nm_sd_5
ELSE k.nm_sd_6
END AS nm_sumber
🧹 Filter Akhir
WHERE
a.tahun = 2023
AND a.kd_perubahan = 17
AND a.kd_kegiatan != 0
AND a.kd_sub_kegiatan != 0
Query ini hanya mengambil data tahun 2023, untuk perubahan ke-17, serta hanya untuk entitas yang sudah memiliki kegiatan dan sub kegiatan.
📋 Output Utama yang Ditampilkan
| Kolom | Keterangan |
|---|---|
| tahun, kd_opd, kd_sub_opd | Identitas organisasi |
| nm_sub_opd, nm_urusan, nm_bidang | Nama-nama yang diambil dari referensi |
| urai_program, urai_kegiatan, urai_sub_kegiatan | Uraian per jenjang kegiatan |
| kd_rekening, nama_rekening | Rincian kode dan nama rekening |
| satuan123, jumlah_satuan | Satuan dan kuantitas |
| pagu (alias dari total) | Nilai pagu anggaran |
| nm_sumber | Nama sumber dana hasil logika CASE |
📌 Ringkasan
Query ini merupakan contoh nyata bagaimana SQL digunakan dalam dunia nyata untuk:
- Integrasi multi tabel melalui inner dan left join.
- Menangani kondisi data tidak lengkap dengan CASE.
- Mengubah data menjadi format terbaca dengan CONCAT.
Pemahaman query seperti ini sangat penting dalam pengelolaan data pemerintahan, business intelligence, atau pelaporan keuangan.
📌 Kode SQL Lengkap
Berikut ini adalah query SQL lengkap yang digunakan dalam tutorial ini:
SELECT
a.tahun,
a.kd_opd,
a.kd_sub_opd,
g.nm_sub_opd,
a.kd_urusan,
b.nm_urusan,
a.kd_bidang,
c.nm_bidang,
a.kd_program,
d.urai_program,
a.kd_kegiatan,
e.urai_kegiatan,
a.kd_sub_kegiatan,
f.urai_sub_kegiatan,
a.kd_belanja,
CONCAT(a.kd_rek_1, '.', a.kd_rek_2, '.', a.kd_rek_3, '.', a.kd_rek_4, '.', a.kd_rek_5, '.', a.kd_rek_6) AS kd_rekening,
l.nm_rek_6 AS nama_rekening,
a.belanja_rinc AS nama_kelompok_belanja,
a.satuan123,
a.jumlah_satuan,
a.belanja_rinc_sub AS nama_standar_harga,
CASE
WHEN a.kd_sumber_dana_4=0 OR a.kd_sumber_dana_4 IS NULL THEN j.nm_sd_3
WHEN a.kd_sumber_dana_5=0 OR a.kd_sumber_dana_5 IS NULL THEN i.nm_sd_4
WHEN a.kd_sumber_dana_6=0 OR a.kd_sumber_dana_6 IS NULL THEN h.nm_sd_5
ELSE k.nm_sd_6
END AS nm_sumber,
a.total AS pagu
FROM prod_anggaran.dbo.ta_rask_arsip a
INNER JOIN prod_referensi.dbo.ref_urusan b
ON a.kd_urusan = b.kd_urusan AND b.kd_jenis_daerah = 1
INNER JOIN prod_anggaran.dbo.ref_bidang c
ON a.kd_urusan = c.kd_urusan AND a.kd_bidang = c.kd_bidang
INNER JOIN prod_anggaran.dbo.ta_program d
ON a.tahun = d.tahun AND a.kd_opd = d.kd_opd
AND a.kd_sub_opd = d.kd_sub_opd AND a.kd_urusan = d.kd_urusan
AND a.kd_bidang = d.kd_bidang AND a.kd_program = d.kd_program
INNER JOIN prod_anggaran.dbo.ta_kegiatan e
ON a.tahun = e.tahun AND a.kd_opd = e.kd_opd
AND a.kd_sub_opd = e.kd_sub_opd AND a.kd_urusan = e.kd_urusan
AND a.kd_bidang = e.kd_bidang AND a.kd_program = e.kd_program
AND a.kd_kegiatan = e.kd_kegiatan
INNER JOIN prod_anggaran.dbo.ta_sub_kegiatan f
ON a.tahun = f.tahun AND a.kd_opd = f.kd_opd
AND a.kd_sub_opd = f.kd_sub_opd AND a.kd_urusan = f.kd_urusan
AND a.kd_bidang = f.kd_bidang AND a.kd_program = f.kd_program
AND a.kd_kegiatan = f.kd_kegiatan AND a.kd_sub_kegiatan = f.kd_sub_kegiatan
INNER JOIN prod_referensi.dbo.ta_sub_opd g
ON a.kd_opd = g.kd_opd AND a.kd_sub_opd = g.kd_sub_opd
LEFT JOIN prod_referensi.dbo.ref_sumber_dana_6 k
ON a.kd_sumber_dana_1 = k.kd_sd_1 AND a.kd_sumber_dana_2 = k.kd_sd_2
AND a.kd_sumber_dana_3 = k.kd_sd_3 AND a.kd_sumber_dana_4 = k.kd_sd_4
AND a.kd_sumber_dana_5 = k.kd_sd_5 AND a.kd_sumber_dana_6 = k.kd_sd_6
LEFT JOIN prod_referensi.dbo.ref_sumber_dana_5 h
ON a.kd_sumber_dana_1 = h.kd_sd_1 AND a.kd_sumber_dana_2 = h.kd_sd_2
AND a.kd_sumber_dana_3 = h.kd_sd_3 AND a.kd_sumber_dana_4 = h.kd_sd_4
AND a.kd_sumber_dana_5 = h.kd_sd_5
LEFT JOIN prod_referensi.dbo.ref_sumber_dana_4 i
ON a.kd_sumber_dana_1 = i.kd_sd_1 AND a.kd_sumber_dana_2 = i.kd_sd_2
AND a.kd_sumber_dana_3 = i.kd_sd_3 AND a.kd_sumber_dana_4 = i.kd_sd_4
LEFT JOIN prod_referensi.dbo.ref_sumber_dana_3 j
ON a.kd_sumber_dana_1 = j.kd_sd_1 AND a.kd_sumber_dana_2 = j.kd_sd_2
AND a.kd_sumber_dana_3 = j.kd_sd_3
LEFT JOIN prod_referensi.dbo.ref_rek_6 l
ON a.kd_rek_1 = l.kd_rek_1 AND a.kd_rek_2 = l.kd_rek_2
AND a.kd_rek_3 = l.kd_rek_3 AND a.kd_rek_4 = l.kd_rek_4
AND a.kd_rek_5 = l.kd_rek_5 AND a.kd_rek_6 = l.kd_rek_6
WHERE
a.tahun = 2023
AND a.kd_perubahan = 17
AND a.kd_kegiatan != 0
AND a.kd_sub_kegiatan != 0;
