Anda di halaman 1dari 9

CSF2600700 BASIS DATA SEMESTER GENAP 2020/2021

Kuis 2 | Sabtu, 5 Juni 2021 pukul 09.00 - 10.30

PETUNJUK PENGERJAAN

1. Jawaban ditulis langsung di berkas soal ini (file .docx). Isilah NPM, Nama, dan Kelas
pada bagian header.
2. Kuis 2 berupa soal SQL yang dikerjakan pada psql (terminal) PostgreSQL. Peserta
diharapkan mengerjakan Kuis 2 pada server PostgreSQL melalui server Kawung.
3. Petunjuk koneksi ke server PostgreSQL DB (melalui server Kawung) dapat dilihat pada
Dokumen Tutorial 1.
4. Jika terdapat kendala koneksi ke server Postgres DB di Kawung, peserta diperbolehkan
untuk menggunakan PostgreSQL DB di lokal komputer masing-masing. Pastikan nama
database yang digunakan sama dengan nama akun SSO. Petunjuk menginstall dan
menggunakan psql PostgreSQL pada lokal komputer dapat dilihat pada tutorial ini.
5. Import DDL schema pada ‘DDL Script.sql’ ke server Postgres DB Kawung maupun di
lokal komputer.
6. Untuk pengumpulan berkas jawaban, konversi terlebih dahulu berkas word menjadi
pdf. Simpan dengan format penamaan “Kelas_NPM.pdf”, sebagai contoh:
E_12345678910.pdf.
7. Berkas pdf dikumpulkan melalui slot pengumpulan yang telah disediakan di Scele.
8. Apabila masih ada masalah terkait koneksi, segera menghubungi dosen/asdos.

Detail Dokumen yang Dikumpulkan:


1. Berisi jawaban yang terdiri dari nomor soal, SQL Query (teks) dan capture SQL
Query beserta output.
2. Jawaban tanpa screenshoot tidak akan dinilai.

===========================================================================

Kuis 2 akan menggunakan skema database dari kasus PacilBisa.


● Skema relasional PacilBisa dapat dilihat pada link ini.
● Deskripsi tabel PacilBisa dapat dilihat pada link ini.
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

Soal Kuis 2
Dengan menggunakan skema database PacilBisa, kerjakan soal berikut ini.

1. Berdasarkan regulasi yang berlaku setiap pengumpulan uang dan barang sumbangan harus
memiliki izin dari otoritas yang berwenang. Untuk memfasilitasi pihak otoritas dari
Kementerian Sosial dalam mengawasi proses penggalangan dana di PacilBisa, sistem
menyimpan data pengguna PENGAWAS_LEGAL. Seorang PENGAWAS_LEGAL ditunjuk untuk
mengawasi satu CAMPAIGN penggalangan dana atau bantuan di PacilBisa.
Buatlah sebuah relasi PENGAWAS_LEGAL dengan ketentuan sebagai berikut.
PENGAWAS LEGAL
Nama Atribut Tipe Atribut Keterangan

Username varchar(20) PK, not null.


FK ke PENGGUNA username

No_induk_pegawai char(10) Unique, not null

No_surat_tugas_pengawasan char(8) Nomor yang valid adalah


yang tiga karakter
pertamanya adalah “OBS”
yang semuanya huruf kapital.
Not null

Status_pengawas varchar(10) Default value ‘DITUGASKAN’

Kode_campaign_overseen varchar(8) FK ke CAMPAIGN Kode.


Not null

CREATE TABLE PENGAWAS_LEGAL(


username varchar(20) PRIMARY KEY,
no_induk_pegawai char(10) UNIQUE NOT NULL,
No_surat_tugas_pengawasan char(8) NOT NULL,
status_pengawas varchar(10) DEFAULT 'DITUGASKAN',
kode_campaign_overseen varchar(8),
FOREIGN KEY (username) REFERENCES PENGGUNA(username),
FOREIGN KEY (kode_campaign_overseen) REFERENCES CAMPAIGN(kode),
CONSTRAINT CHECK_no_surat CHECK (no_surat_tugas_pengawasan LIKE 'OBS%')
);

1
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

2. Dikarenakan suatu kebijakan kemitraan perusahaan, semua penggalang dana perusahaan


diwajibkan membuat campaign dengan nama bank: ‘BANK MONDSTADT.’ Perbarui data
semua campaign yang dibuat oleh penggalang dana perusahaan sehingga nama bank yang
terdaftar untuk campaign-nya adalah ‘BANK MONDSTADT’.
-- nomor 2
UPDATE CAMPAIGN
SET nama_bank = 'MONDSTADT'
WHERE penggalang_bantuan in (SELECT username FROM
PENGGALANG_BANTUAN_PERUSAHAAN);

3. Tampilkan username dan nama lengkap pengguna yang pernah menjadi penggalang
bantuan untuk campaign berjudul 'bantu korban bencana alam' dan 'bantu pasien sakit'
sekaligus. (pengguna tersebut pernah menggalang campaign untuk keduanya).
SELECT P.username, P.nama_lengkap
FROM PENGGUNA P
WHERE P.username in (SELECT penggalang_bantuan FROM campaign WHERE judul = 'bantu
korban bencana alam')
AND P.username in (SELECT penggalang_bantuan FROM campaign WHERE judul = 'bantu
pasien sakit');

2
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

4. Tampilkan Username dan no telepon penggalang bantuan yang kampanyenya sudah


mendapatkan bantuan uang tapi belum mengajukan proses pencairan bantuan.
SELECT P.username, PE.no_telp FROM PENGGUNA P
JOIN PENGGALANG_BANTUAN PE ON PE.username = P.username
JOIN CAMPAIGN C ON C.penggalang_bantuan = PE.username
JOIN LAPORAN L ON L.pembuat = PE.username
WHERE P.username NOT IN (Select penggalang from pencairan_dana);

5. Tampilkan nominal bantuan dan no telepon dari donatur yg memberikan donasi uang lebih
dari 1 juta rupiah pada satu transaksi. Tampilkan hanya nomor telepon yang berbeda dan
terurut berdasarkan jumlah donasi dimana jumlah terbesar ditampilkan lebih dulu.
SELECT DISTINCT DUN.nominal, D.no_telp FROM DONATUR D
JOIN DONASI DON ON D.Username=DON.donatur
JOIN DONASI_UANG DUN ON DUN.id_donasi=DON.id_donasi
WHERE nominal >= 1000000
ORDER BY nominal DESC;

3
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

6. Untuk setiap campaign, tampilkan judul campaign beserta total nominal donasi uang
terkumpul. Tampilkan hanya judul campaign yang total nominal donasi uangnya lebih dari
atau sama dengan 1000000.
SELECT DON.campaign, SUM(D.nominal) AS total_nominal
FROM CAMPAIGN C
JOIN DONASI DON ON DON.campaign = C.kode
JOIN DONASI_UANG D ON D.id_donasi = DON.id_donasi
GROUP BY DON.campaign
HAVING SUM(D.nominal) >= 1000000;

7. Tampilkan nama ekspedisi beserta nomor resi pengiriman yang pernah ekspedisi tersebut
tangani. Jika ekspedisi belum pernah melakukan pengiriman, nama ekspedisi tetap
ditampilkan namun nomor resinya diisi null.
Tampilkan hasilnya terurut secara alfabetis berdasarkan nama ekspedisi.
-- nomor 7
SELECT E.nama_ekspedisi, STRING_AGG(P.no_resi, ',') AS nomor_resi
FROM EKSPEDISI E
LEFT JOIN PENGIRIMAN P ON E.kode_ekspedisi = P.kode_ekspedisi

4
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

GROUP BY E.kode_ekspedisi
ORDER BY E.nama_ekspedisi ASC;

8. Buatlah sebuah view bernama campaign_view yang berisi judul campaign yang jenis
donasinya sama dengan jenis donasi campaign yang digalang oleh 'Curry Hildrew' . Setelah
view dibuat, tampilkan isi campaign_view tersebut.

(catatan: judul campaign yang dilakukan 'Curry Hildrew' tidak perlu ditampilkan)
CREATE VIEW CAMPAIGN_VIEW AS
SELECT judul FROM campaign
WHERE jenis_donasi IN (
SELECT DISTINCT jenis_donasi FROM CAMPAIGN C, PENGGUNA P
WHERE C.penggalang_bantuan = P.username
AND P.nama_lengkap = 'Curry Hildrew'
);

SELECT * FROM CAMPAIGN_VIEW;

5
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

9.

Penggalang bantuan ingin melakukan pencairan dana uang dari suatu campaign. Namun
admin perlu memastikan nominal dana yang masuk masih tersedia, karena dikhawatirkan
penggalang bantuan sudah melakukan pencairan dana. Untuk itu setiap pengajuan pencairan
dana perlu dilakukan pengecekan jumlah donasi uang tersisa yang belum dicairkan.

Buatlah stored function untuk menghitung jumlah donasi uang sisa yang belum dicairkan oleh
suatu campaign (beri nama function: HitungAvailableUang). Hal yang dilakukan:

- Hitunglah terlebih dahulu donasi uang yang sudah masuk berdasarkan kode campaign
yang diberikan pada saat insert Pencairan Dana. Untuk itu perlu menghitung jumlah
nominal uang yang sudah masuk berdasarkan nominal dari receipt pencairan dana
yang ada.
- Hitunglah jumlah nominal uang yang sudah dicairkan berdasarkan kode campaign
yang sama, dengan menghitung jumlah nominal uang yang sudah dicairkan
berdasarkan nominal dari receipt pencairan dana yang ada.

- Apabila nominal pencairan dana yang diminta (insert) lebih besar dari jumlah donasi
uang sisa yang belum dicairkan, maka tampilkan warning “Campaign % tidak dapat
melakukan penarikan dana lagi”.

Buatlah trigger (beri nama CekValidPencairan) untuk memproses permintaan pencairan dana
(insert) sehingga perlu memanggil HitungAvailableUang.

Jalankan perintah insert berikut:

INSERT INTO Pencairan_Dana (penggalang, campaign, tanggal, nominal, verifikator,status)


VALUES
('goldstatesup','pb-010','2019-03-06 00:00:00',13000000,'jogilvy0','sedang
diproses');

10.

Pada deskripsi requirement:

Saat melakukan pencairan dana, informasi yang dibutuhkan adalah jumlah dana yang ingin
dicairkan dan tanggal pencairan. PacilBisa akan mengirimkan kode verifikasi melalui nomor
ponsel penggalang bantuan untuk memastikan bahwa permintaan pencairan dana valid.
Permohonan pencairan dana akan diverifikasi oleh Admin. Selama proses verifikasi,

6
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

permohonan pencairan dana akan berstatus “Sedang Diproses”. Setelah berhasil diverifikasi,
status pencairan dana akan berubah menjadi “Berhasil” dan PacilBisa akan mengirimkan
receipt pencairan dana kepada penggalang bantuan yang menunjukkan bahwa dana
campaign telah berhasil dicairkan. Receipt pencairan dana tersebut berisi informasi berupa
nomor receipt, waktu transaksi, jumlah dana yang dicairkan, dan deskripsi.

Untuk memenuhi deskripsi tersebut, admin perlu memverifikasi untuk permohonan


pencairan dana yang sudah masuk. Admin perlu menjalankan stored procedure dengan
deskripsi di bawah ini.

Buatlah stored procedure (beri nama: UpdatePencairanDana) untuk melakukan update


terhadap status pencairan dana dari suatu campaign dan membuat receipt pencairan dana.
Parameter yang dikirimkan adalah penggalang bantuan username, campaign, waktu dan
nomor receipt yang baru (noUrut).

Hal yang dilakukan:

- Dapatkan terlebih dahulu nominal uang yang akan diproses dengan pencarian
berdasarkan parameter penggalang bantuan username, kode campaign yang dikirim
dan status ‘sedang diproses’.
- Update status dari ‘sedang diproses’ menjadi ‘Berhasil’
- Buatlah receipt pencairan dana yang disimpan ke tabel RECEIPT_PENCAIRAN_DANA
dengan no_receipt berisi ‘rpd-’ + noUrut dan nilai nominal sesuai nominal dari
permintaan pencairan dana.
- Sebagai bonus (5 poin), jika waktu_receipt mengambil waktu sistem sekarang /
NOW().

Jalankan perintah berikut:

SELECT UpdatePencairanDana(‘neutrogena’, ‘pb-030’, '2021-04-16 09:00:00', 12);

atau

SELECT UpdatePencairanDana(‘neutrogena’, ‘pb-030’,12); /untuk yang bonus

Selanjutnya jalankan query:

SELECT * FROM PENCAIRAN_DANA;

SELECT * FROM RECEIPT_PENCAIRAN_DANA;

(Jangan lupa screen shoot untuk setiap perintah di atas)

7
NPM : 1906350704

Kelas: D
Nama : Geoffrey Tyndall

-- Akhir Dokumen Soal --

Anda mungkin juga menyukai