Membongkar Query SQL Kompleks untuk Analisis Anggaran Daerah

Pinterest LinkedIn Tumblr +

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

KolomKeterangan
tahun, kd_opd, kd_sub_opdIdentitas organisasi
nm_sub_opd, nm_urusan, nm_bidangNama-nama yang diambil dari referensi
urai_program, urai_kegiatan, urai_sub_kegiatanUraian per jenjang kegiatan
kd_rekening, nama_rekeningRincian kode dan nama rekening
satuan123, jumlah_satuanSatuan dan kuantitas
pagu (alias dari total)Nilai pagu anggaran
nm_sumberNama 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;

Share.

About Author

Kami percaya bahwa belajar teknologi tidak harus bikin pusing. Lewat konten edukatif dan kelas online di bytecourse.id, Kami berusaha membantu siapa saja—terutama pemula—agar bisa belajar coding dan desain dengan cara yang santai, relevan, dan aplikatif.

Leave A Reply