-
-
Save hidayat365/4144596 to your computer and use it in GitHub Desktop.
CREATE OR REPLACE FUNCTION transkrip(CHAR) | |
RETURNS TABLE(nim CHAR, kode_mk CHAR, nama_mk CHAR, nilai CHAR) AS | |
$$ | |
BEGIN | |
RETURN QUERY | |
SELECT tmp1.nim, tmp1.kode_mk, tmp1.nama_mk, tmp1.nilai | |
FROM ( | |
SELECT A.nim, A.kode_mk, B.nama_mk, A.nilai | |
, row_number() over(partition by A.kode_mk order by A.nilai) baris | |
FROM khs A JOIN mata_kuliah B ON A.kode_mk = B.kode_mk | |
WHERE A.nim = $1 | |
) tmp1 | |
WHERE baris = 1; | |
END; | |
$$ | |
LANGUAGE plpgsql; |
rupanya harus dikasih table aliasnya
-- It's Works !! :-D
universitas=> SELECT * FROM transkrip('081011124');
nim | kode_mk | nama_mk | nilai
-----------+-----------+----------------------------------------------------+-------
081011124 | IPKU 1001 | Agama | D
081011124 | IPKU 1101 | Pancasila | B
081011124 | TIFS 2204 | Pemrograman Java | B
(3 rows)
-- Thanks, mastah... :-D
-- Tinggal penjelasannya dari fungsinya ini.. :-D
lha? kan dah dijelasin tadi, hasil query join
FROM khs A JOIN mata_kuliah B ON A.kode_mk = B.kode_mk
diberikan kolom tambahan baris menggunakan window function
row_number() over(partition by kode_mk order by nilai)
maksudnya adalah membagi/mempartisi hasil query berdasarkan kode_mk
,
kemudian mengurutkan berdasarkan nilai
, A/B/C/D otomatis terurut abjad
setelah itu diberi nomor baris.
pastinya yang nilai tertinggi akan punya nomor baris 1
mudheng ora?
untuk ngecek logikanya, coba jalankan query ini
SELECT A.nim, A.kode_mk, B.nama_mk, A.nilai
, row_number() over(partition by A.kode_mk order by A.nilai) baris
FROM khs A JOIN mata_kuliah B ON A.kode_mk = B.kode_mk
WHERE A.nim = '081011124'
perhatikan tambahan field baris
Ohh.. iya Mas, fungsi ane yang awal baru sampe tahap query join, belum begitu paham tentang window function (ilmu belum sampe, Mas).
:-)
Ane udah coba dan cek logikanya, ada baris 1 dan 2 untuk nilai di kolom baris
.
Iyaa.. bisa terurut abjad (ane baru tau). :-D
Bagian: tmp1.nim, tmp1.kode_mk, tmp1.nama_mk, tmp1.nilai
, dan
) tmp1
WHERE baris = 1;
itu untuk apa ya?
Maap.. banyak nanya. :-p
Terima kasih, Mas..
hasil subquery kita beri nama alias tmp1
kemudian pada query terluar cukup select field tmp1.nim, tmp1.kode_mk, tmp1.nama_mk, tmp1.nilai
agar tambahan field baris
tidak ikut dalam result set
kemudian WHERE baris=1
ya nampilin hanya nilai tertinggi yang pasti sudah bernomor baris 1
saran saya ketika bekerja dengan database, hilangkan paradigma coding prosedural yang biasa menggunakan looping, karena saat memproses data di database paradigma yang kita pakai adalah set atau himpunan. itulah sebabnya hasil query biasa disebut sebagai result set
Begitu ya.. saya cukup mengerti deh sekarang.. :-)
Oiya.. ini sebenarnya tugas kuliah dari masa lalu, dan saya gagal. :-(
Tapi saya belum menyerah, masih mau cari jawabannya (hee.. seperti ada rasa dendam).
Dosennya juga tidak kasih jawabannya. Cuma dikasih clue pake IF dan LOOP. Muter-muter menyelesaikan soal ini, tapi alhasil nilai SQL saya kemarin jeblok banget.
Hehehehe.. ribet deh.. :-D
Dan kalau udah ketemu jawabannya seperti ini, ada niat nantinya fungsi ini mau saya expand lagi. Hee.. coba-coba sendiri aja, tiba-tiba jadi kepikiran. (yang ini bukan tugas kuliah lho, Mas.. cuma pengen explore fungsi di SQL aja).
Nilai dari mata kuliah yang memakai kurikulum lama (misal: 2007) akan dikonversi ke nilai dengan mata kuliah di kurikulum baru (misal: 2012), jadi kolom nilai
mata kuliah di kurikulum baru akan mengambil kolom nilai
dari mata kuliah di kurikulum lama.
Misal, di kurikulum 2007, ada mata kuliah Pancasila = nilai B, lalu mata kuliah tersebut dikonversi ke kurikulum 2012 menjadi Kewarganegaraan, maka mata kuliah Kewarganegaraan = nilai B.
Dan ada beberapa kasus lainnya, yang saya ciptakan sendiri.
Hehehehe.. saya kadang doyan bikin soal sendiri, tapi malah bingung dan stress saat mau buat jawabannnya.
:-p
Jawaban dari Mas bisa buat saya jadikan pondasi untuk membuat fungsi berikutnya.
Hmm.. saya belum begitu mengerti tentang coding prosedural, tapi memang bekerja dengan bahasa pemrograman database berbeda dengan bahasa pemrograman lainnya.
Terima kasih, Mas..
Mudah-mudahan tidak kapok memberikan pelajaran bagi newbie seperti saya ini.
:-)
-- Output Fungsi:
universitas=> SELECT * FROM transkrip('081011124');
ERROR: column reference "nim" is ambiguous
LINE 1: SELECT nim, kode_mk, nama_mk, nilai
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
QUERY: SELECT nim, kode_mk, nama_mk, nilai
FROM (
SELECT A.nim, A.kode_mk, B.nama_mk, A.nilai,
row_number() over(partition by A.kode_mk order by A.nilai) baris
FROM khs A JOIN mata_kuliah B ON A.kode_mk = B.kode_mk WHERE A.nim = $1
) tmp1
WHERE baris = 1
CONTEXT: PL/pgSQL function "transkrip" line 3 at RETURN QUERY