query attainment cpl | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: query attainment cpl

Saturday, May 2, 2026

query attainment cpl

🎓 ARTIKEL 19 DARI 20 — OBE FROM ZERO TO ZORRO

Query SQL untuk Menghitung
Attainment CPL Secara Otomatis

Dari JOIN tabel hingga stored procedure — panduan lengkap query SQL OBE untuk pemula yang ingin hasil attainment real-time tanpa hitung manual.

#QuerySQL #AttainmentCPL #StoredProcedure #JoinTabelOBE #KurikulumOBE
⏱️
12 Menit
Estimasi Baca
🎯
Pemula–Menengah
Level Artikel
📅
2026
Tahun Terbit
🗄️
Fase 4 — Digitalisasi
Fase OBE

Pernah nggak kamu habiskan waktu berjam-jam hanya untuk menghitung attainment CPL secara manual di spreadsheet — lalu sadar ada 3 nilai yang salah input, dan harus mengulang dari awal? 😩 Kalau iya, kamu nggak sendirian. Itulah masalah klasik yang dihadapi hampir semua pengelola kurikulum OBE sebelum mereka mengenal query SQL attainment CPL. Di artikel ke-19 seri OBE from Zero to Zorro ini, kita akan bahas tuntas bagaimana cara membuat database OBE yang sudah kita bangun di artikel sebelumnya bekerja otomatis — menjawab pertanyaan "seberapa tercapaikah CPL ini?" hanya dalam hitungan detik, bukan jam.

📐 Definisi Kunci

Attainment CPL = Rata-rata persentase ketercapaian seluruh CPMK yang pemetaannya terhubung ke satu CPL tertentu, dihitung dari nilai aktual mahasiswa di setiap penilaian.

Dalam konteks SQL: ini adalah hasil JOIN + GROUP BY + AVG() dari tabel nilai, pemetaan CPMK, dan pemetaan CPL dalam satu query terpadu.

🗂️ Memahami Alur Data OBE Sebelum Nulis Query SQL Attainment CPL

Bayangkan database OBE seperti sebuah rantai makanan. Di ujung paling bawah ada mahasiswa dengan nilai di tiap komponen penilaian. Nilai itu dipetakan ke CPMK (Capaian Pembelajaran Mata Kuliah), dan CPMK dipetakan ke CPL (Capaian Pembelajaran Lulusan). Tanpa memahami rantai ini, query SQL yang kamu tulis akan menghasilkan angka yang salah — atau bahkan error.

Tabel Peran dalam Kalkulasi Relasi ke
nilai_mahasiswa Sumber nilai mentah mahasiswa komponen_penilaian
komponen_penilaian Bobot & definisi setiap penilaian pemetaan_cpmk
pemetaan_cpmk Hubungkan komponen → CPMK cpmk, pemetaan_cpl
pemetaan_cpl Hubungkan CPMK → CPL cpl
cpl Target akhir pengukuran attainment program_studi
💡
Tips Sebelum Mulai Nulis Query

Pastikan skema tabel database OBE-mu sudah sesuai DDL yang dibahas di artikel sebelumnya. Query SQL attainment CPL ini dibangun di atas struktur tabel tersebut. Kalau tabelnya beda, query-nya perlu disesuaikan!

🔗 Teknik JOIN Tabel OBE: Dari Nilai Mentah ke Attainment CPL

JOIN dalam SQL seperti "menyambungkan puzzle". Setiap tabel adalah kepingan yang masing-masing menyimpan satu informasi. Untuk mendapat gambaran utuh attainment CPL, kita harus menyambungkan semua kepingan itu dalam satu query. Kita mulai dari yang paling sederhana — query agregasi attainment OBE per CPMK dulu.

1
Query Attainment per CPMK (per Mata Kuliah)

Langkah pertama: hitung rata-rata nilai mahasiswa per komponen, lalu petakan ke CPMK terkait. Ini adalah fondasi dari semua kalkulasi attainment.

attainment_per_cpmk.sql
-- =====================================================
-- QUERY 1: Attainment per CPMK per Mata Kuliah
-- =====================================================
SELECT
    mk.kode_mk,
    mk.nama_mk,
    cpmk.kode_cpmk,
    cpmk.deskripsi_cpmk,
    ROUND(
        AVG(nm.nilai_aktual / kp.nilai_maksimum * 100), 2
    ) AS attainment_cpmk_persen
FROM nilai_mahasiswa nm
JOIN komponen_penilaian kp 
    ON nm.id_komponen = kp.id_komponen
JOIN pemetaan_cpmk pc_map 
    ON kp.id_komponen = pc_map.id_komponen
JOIN cpmk 
    ON pc_map.id_cpmk = cpmk.id_cpmk
JOIN mata_kuliah mk 
    ON cpmk.id_mk = mk.id_mk
GROUP BY
    mk.kode_mk, mk.nama_mk,
    cpmk.kode_cpmk, cpmk.deskripsi_cpmk
ORDER BY
    mk.kode_mk, cpmk.kode_cpmk;
2
Query Attainment CPL — Agregasi dari CPMK ke CPL

Sekarang kita naik satu level. Gunakan hasil attainment CPMK di atas sebagai subquery, lalu JOIN dengan tabel pemetaan CPL untuk mendapatkan attainment di level CPL.

attainment_cpl.sql
-- =====================================================
-- QUERY 2: Attainment CPL (agregasi dari CPMK)
-- =====================================================
SELECT
    cpl.kode_cpl,
    cpl.deskripsi_cpl,
    prodi.nama_prodi,
    ROUND(AVG(sub.attainment_cpmk_persen), 2) 
        AS attainment_cpl_persen,
    CASE
        WHEN AVG(sub.attainment_cpmk_persen) >= 75 
            THEN '✅ Tercapai'
        WHEN AVG(sub.attainment_cpmk_persen) >= 60 
            THEN '⚠️ Hampir Tercapai'
        ELSE '❌ Belum Tercapai'
    END AS status_attainment
FROM (
    -- Subquery: attainment per CPMK
    SELECT
        pc_map.id_cpl,
        cpmk.id_cpmk,
        ROUND(
            AVG(nm.nilai_aktual / kp.nilai_maksimum * 100), 2
        ) AS attainment_cpmk_persen
    FROM nilai_mahasiswa nm
    JOIN komponen_penilaian kp 
        ON nm.id_komponen = kp.id_komponen
    JOIN pemetaan_cpmk pc_map 
        ON kp.id_komponen = pc_map.id_komponen
    JOIN cpmk ON pc_map.id_cpmk = cpmk.id_cpmk
    GROUP BY pc_map.id_cpl, cpmk.id_cpmk
) sub
JOIN cpl ON sub.id_cpl = cpl.id_cpl
JOIN program_studi prodi 
    ON cpl.id_prodi = prodi.id_prodi
GROUP BY
    cpl.kode_cpl, cpl.deskripsi_cpl, prodi.nama_prodi
ORDER BY
    cpl.kode_cpl;
Insight Penting: Threshold Attainment

Threshold 75% yang dipakai di contoh query di atas bukanlah angka baku nasional. Setiap perguruan tinggi bisa menetapkan standar sendiri melalui SK Rektor atau Kebijakan Akademik. Pastikan kamu ganti nilai ini sesuai kebijakan institusimu sebelum digunakan di SIAKAD.

⚙️ Stored Procedure OBE: Otomatisasi Query SQL Attainment CPL

Kalau query di atas harus dijalankan manual setiap kali ada perubahan nilai, itu masih setengah otomatis. Solusi sesungguhnya adalah stored procedure OBE — bayangkan ini seperti "tombol ajaib" di database. Tekan sekali, semua attainment langsung terhitung. Stored procedure juga bisa menerima parameter, misalnya kode semester atau program studi, sehingga laporan bisa difilter dengan mudah.

3
Membuat Stored Procedure Attainment CPL per Semester

Stored procedure ini menerima parameter p_semester dan p_id_prodi, lalu menghitung attainment CPL secara otomatis dan menyimpannya ke tabel hasil.

sp_hitung_attainment_cpl.sql
-- =====================================================
-- STORED PROCEDURE: Hitung Attainment CPL
-- Parameter: semester (VARCHAR), id_prodi (INT)
-- =====================================================
DELIMITER $$

CREATE PROCEDURE sp_hitung_attainment_cpl(
    IN p_semester    VARCHAR(20),
    IN p_id_prodi    INT
)
BEGIN
    -- Hapus data lama untuk semester & prodi yg sama
    DELETE FROM hasil_attainment_cpl
    WHERE semester = p_semester
      AND id_prodi  = p_id_prodi;

    -- Masukkan hasil kalkulasi terbaru
    INSERT INTO hasil_attainment_cpl
        (id_cpl, semester, id_prodi, 
         attainment_persen, status_attainment, 
         tgl_hitung)
    SELECT
        cpl.id_cpl,
        p_semester                        AS semester,
        p_id_prodi                        AS id_prodi,
        ROUND(AVG(sub.att_cpmk), 2)       AS attainment_persen,
        CASE
            WHEN AVG(sub.att_cpmk) >= 75 THEN 'Tercapai'
            WHEN AVG(sub.att_cpmk) >= 60 THEN 'Hampir Tercapai'
            ELSE 'Belum Tercapai'
        END                               AS status_attainment,
        NOW()                             AS tgl_hitung
    FROM (
        SELECT
            pcp.id_cpl,
            cpmk.id_cpmk,
            AVG(nm.nilai_aktual 
                / kp.nilai_maksimum * 100) AS att_cpmk
        FROM nilai_mahasiswa nm
        JOIN komponen_penilaian kp 
            ON nm.id_komponen = kp.id_komponen
        JOIN pemetaan_cpmk pcp 
            ON kp.id_komponen = pcp.id_komponen
        JOIN cpmk 
            ON pcp.id_cpmk = cpmk.id_cpmk
        JOIN mata_kuliah mk 
            ON cpmk.id_mk = mk.id_mk
        WHERE mk.semester    = p_semester
          AND mk.id_prodi    = p_id_prodi
        GROUP BY pcp.id_cpl, cpmk.id_cpmk
    ) sub
    JOIN cpl ON sub.id_cpl = cpl.id_cpl
    WHERE cpl.id_prodi = p_id_prodi
    GROUP BY cpl.id_cpl;

    -- Tampilkan ringkasan hasil
    SELECT 
        cpl.kode_cpl,
        hac.attainment_persen,
        hac.status_attainment
    FROM hasil_attainment_cpl hac
    JOIN cpl ON hac.id_cpl = cpl.id_cpl
    WHERE hac.semester  = p_semester
      AND hac.id_prodi  = p_id_prodi
    ORDER BY cpl.kode_cpl;

END$$

DELIMITER ;

-- =====================================================
-- CARA MEMANGGIL STORED PROCEDURE:
-- CALL sp_hitung_attainment_cpl('2025/2026-Genap', 1);
-- =====================================================
🔥
Fakta Menarik: Stored Procedure vs Query Biasa

Stored procedure disimpan di server database dan sudah dikompilasi — artinya eksekusinya jauh lebih cepat daripada mengirim query panjang dari aplikasi. Untuk dataset 5.000+ mahasiswa, perbedaan kecepatannya bisa 3–5x lipat. Cocok banget untuk SIAKAD yang diakses banyak user bersamaan!

📊 Membuat Tabel Penyimpan Hasil Attainment CPL

Stored procedure di atas menyimpan hasilnya ke tabel hasil_attainment_cpl. Pastikan tabel ini sudah ada sebelum stored procedure dijalankan. Berikut DDL-nya:

create_tabel_hasil.sql
-- =====================================================
-- Tabel penyimpan hasil attainment CPL
-- =====================================================
CREATE TABLE IF NOT EXISTS hasil_attainment_cpl (
    id_hasil         INT           AUTO_INCREMENT PRIMARY KEY,
    id_cpl           INT           NOT NULL,
    semester         VARCHAR(20)   NOT NULL,
    id_prodi         INT           NOT NULL,
    attainment_persen DECIMAL(5,2) NOT NULL DEFAULT 0.00,
    status_attainment VARCHAR(30)  NOT NULL,
    tgl_hitung       DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,

    -- Index untuk performa query
    INDEX idx_cpl_semester (id_cpl, semester),
    INDEX idx_prodi_semester (id_prodi, semester),

    -- Foreign keys
    FOREIGN KEY (id_cpl)   REFERENCES cpl(id_cpl),
    FOREIGN KEY (id_prodi) REFERENCES program_studi(id_prodi)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
⚠️
Perhatian: Hak Akses Database

Untuk membuat stored procedure, user database kamu membutuhkan privilege CREATE ROUTINE dan EXECUTE. Di hosting shared atau VPS tertentu, privilege ini mungkin perlu diminta ke administrator. Jangan langsung jalankan di database production tanpa backup terlebih dahulu!

🔍 Query Verifikasi dan Monitoring Attainment CPL

Setelah stored procedure dijalankan, kamu butuh query untuk membaca dan memverifikasi hasilnya. Berikut beberapa query SQL attainment CPL yang berguna untuk monitoring rutin:

4
Query Ringkasan Attainment Semua CPL per Semester

Gunakan ini untuk laporan cepat ke pimpinan atau untuk ditampilkan di dashboard SIAKAD.

monitoring_attainment.sql
-- =====================================================
-- QUERY MONITORING: Ringkasan semua CPL per Semester
-- =====================================================
SELECT
    cpl.kode_cpl,
    LEFT(cpl.deskripsi_cpl, 60) AS deskripsi_singkat,
    hac.semester,
    hac.attainment_persen,
    hac.status_attainment,
    DATE_FORMAT(hac.tgl_hitung, '%d %M %Y %H:%i') 
        AS terakhir_dihitung
FROM hasil_attainment_cpl hac
JOIN cpl ON hac.id_cpl = cpl.id_cpl
WHERE hac.semester = '2025/2026-Genap'
  AND hac.id_prodi = 1
ORDER BY cpl.kode_cpl;

-- =====================================================
-- QUERY: CPL yang BELUM Tercapai (untuk tindak lanjut)
-- =====================================================
SELECT
    cpl.kode_cpl,
    cpl.deskripsi_cpl,
    hac.attainment_persen,
    ROUND(75 - hac.attainment_persen, 2) AS gap_ke_target
FROM hasil_attainment_cpl hac
JOIN cpl ON hac.id_cpl = cpl.id_cpl
WHERE hac.status_attainment != 'Tercapai'
  AND hac.semester = '2025/2026-Genap'
ORDER BY hac.attainment_persen ASC;
📈 Analisis: Kapan Harus Menjalankan Stored Procedure?
✅ Waktu Ideal
  • Setelah entri nilai UAS selesai
  • Sebelum rapat evaluasi kurikulum
  • Akhir semester akademik
  • Sebelum akreditasi / visitasi
⚡ Otomasi Lanjutan
  • Gunakan MySQL Event Scheduler
  • Jadwalkan setiap malam pukul 01.00
  • Atau gunakan Cron Job dari backend
  • Kirim notifikasi email jika ada CPL turun
💡
Tips Performa: Tambahkan Index yang Tepat

Jika database-mu sudah punya ribuan data nilai, query JOIN yang kompleks bisa lambat. Tambahkan index pada kolom foreign key di tabel nilai_mahasiswa, pemetaan_cpmk, dan pemetaan_cpl untuk mempercepat eksekusi query SQL attainment CPL secara signifikan.

#KurikulumOBE #KKNI #OBE #QuerySQLAttainmentCPL #StoredProcedureOBE #JoinTabelOBE #AgregasiAttainment #SIAKAD
📌 Kesimpulan Artikel

Dari Query Sederhana ke Sistem Attainment yang Bekerja Sendiri

Di artikel ini, kita sudah melewati perjalanan lengkap: dari memahami alur relasi tabel OBE, menulis query SQL attainment CPL step by step menggunakan teknik JOIN tabel OBE, hingga mengemas semuanya dalam stored procedure OBE yang bisa dipanggil kapan saja dengan satu baris perintah.

Kamu juga sudah tahu cara membuat tabel penyimpan hasil attainment, query monitoring untuk laporan, dan strategi penggunaan index agar performa database tetap optimal. Ini bukan sekadar teori — semua kode di sini siap kamu adaptasi ke SIAKAD-mu sendiri.

🎯 Langkah selanjutnya: Setelah data attainment tersimpan rapi di database, pertanyaan berikutnya adalah — bagaimana menampilkannya agar mudah dibaca oleh dosen, ketua prodi, atau tim akreditasi? Itulah yang akan kita jawab di artikel penutup seri ini: Dashboard OBE di SIAKAD. Ditunggu ya!

Artikel ini bermanfaat? Bantu teman-temanmu menemukan seri ini dengan share ke grup WAG kampus atau media sosialmu! 🙏

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux