Senin, 12 Juli 2010

Pivot Tabel dalam SQL #1

Pivot adalah memutar, jadi kalo pivot tabel berarti memutar tabel. Jika kita punya data dalam satu kolom dan akan dijadikan kolom tersendiri, berarti kita perlu memutar tabel ini. Pivot tabel dapat dilakukan dengan bantuan fungsi decode.
Tak perlu panjang lebar, kita langsung ke contoh saja. Misalnya kita punya tabel seperti berikut :



kita akan menampilkannya dengan cara mengelompokkan pembayaran perbulan pada kolom sendiri, seperti berikut ini :

NAMA | JAN | FEB | MAR | APR | MEI | JUN | JUL | AGT | SEP | OKT | NOP | DES

Untuk mengelompokkan semua pembayaran pada kolom bulan tersendiri maka kita perlu mengubah bulan tertentu dengan kolom pembayaran.

select nama, sum(decode(bulan,1,bayar,0)) jan,
sum(decode(bulan,2,bayar,0)) feb,
sum(decode(bulan,3,bayar,0)) mar,
sum(decode(bulan,4,bayar,0)) apr,
sum(decode(bulan,5,bayar,0)) mei,
sum(decode(bulan,6,bayar,0)) jun,
sum(decode(bulan,7,bayar,0)) jul,
sum(decode(bulan,8,bayar,0)) agt,
sum(decode(bulan,9,bayar,0)) sep,
sum(decode(bulan,10,bayar,0)) okt,
sum(decode(bulan,11,bayar,0)) nop,
sum(decode(bulan,12,bayar,0)) des
from tabel_1
group by nama

Penjelasan :
sum(decode(bulan,1,bayar,0)) Jan, maksudnya sistem akan mencari data bulan 1 dan mengubahnya menjadi data pembayaran, yang bulan lain akan diubah menjadi nol. kemudian menjumlahkannya, nama kolom diubah menjadi JAN.

Filter
Jika hanya butuh data pembayaran hanya tiga bulan, sebaiknya harus difilter dengan perintah where bulan in (1,2,3). Tujuannya, agar data yang keluar adalah nama-nama yang mempunyai data pembayaran di bulan itu saja. Jika tidak difilter, seluruh nama yang ada dalam tabel_1 akan tampil, nama-nama yang tidak mempunyai pembayaran dibulan Januari, Februari, dan Maret akan terisi nol.

Menjumlahkan data pembayaran dalam setahun
Bagaimana cara menambah kolom jumlah? kita modifikasi script-nya menjadi bertingkat seperti berikut ini :

select nama,jan,feb,mar,apr,mei,jun,jul,agt,sep,okt,nop,des,
jan+feb+mar+apr+mei+jun+jul+agt+sep+okt+nop+des jumlah
from tabel_1,
(select noreg reg,sum(decode(bulan,1,bayar,0)) jan,
sum(decode(bulan,2,bayar,0)) feb,
sum(decode(bulan,3,bayar,0)) mar,
sum(decode(bulan,4,bayar,0)) apr,
sum(decode(bulan,5,bayar,0)) mei,
sum(decode(bulan,6,bayar,0)) jun,
sum(decode(bulan,7,bayar,0)) jul,
sum(decode(bulan,8,bayar,0)) agt,
sum(decode(bulan,9,bayar,0)) sep,
sum(decode(bulan,10,bayar,0)) okt,
sum(decode(bulan,11,bayar,0)) nop,
sum(decode(bulan,12,bayar,0)) des
from tabel_1
group by noreg) a
where noreg=a.reg

Perintah select dalam select digunakan untuk menyederhanakan script, bisa dibayangkan seperti apa panjangnya script diatas jika kita tidak mengelompokkan pembayaran tiap bulan dan mengubah nama kolomnya.

Kamis, 08 Juli 2010

Mengenal Fungsi Decode dalam SQL

Dalam praktek sehari-hari dalam menampilkan data sering kali kita harus berhadapan dengan kondisi percabangan, jika ini maka begini, jika itu maka begitu. Kondisi seperti itu dapat ditampilkan dengan bantuan fungsi decode. fungsi ini mirip dengan fungsi if jika di spreadsheet.

Format penerapannya dalam SQL adalah :
decode(nama_kolom, variable_1, nilai_1, variable_2, nilai_2, nilai_3)

penjelasan : Jika dalam suatu kolom veriabel_1 terpenuhi, maka akan dipilih nilai_1, jika yang dipenuhi variabel_2 maka nilai_2 yang akan ditampilkan, dan jika semua variabel tidak dipenuhi, maka yang ditampilkan nilai_3. Variabel dan nilai dapat ditambah sesuai dengan kebutuhan.

Contoh :
misalnya kita punya tabel berikut :
Jika kita akan menampilkan tabel tersebut dengan menambah kolom keterangan, nilai 9 berarti sangat baik, 7 baik, 5 kurang, 4 jelek




maka script SQL-nya adalah :
select nama, nilai, decode(nilai,4,'jelek',5,'kurang',7,'baik',9,'baik_sekali) keterangan from tabel_1

Hasil dari script diatas adalah :
Kelemahan dari fungsi decode adalah kita tidak dapat memakai fungsi logika dalam variabel. Jika kita punya kondisi : 1-4 jelek, 5-6 kurang, 7-9 baik, 10 baik sekali, berarti kita tetap harus memasukkan satu-satu nilai tiap variabel. decode memang berfungsi mengganti nilai suatu kolom apa adanya.

Nilai dari Kolom Lain
Nilai yang ingin ditampilkan dapat di ambil dari kolom lain, misalnya kita punya tabel pembayaran seperti berikut ini :


Kita ingin menampilkan pembayaran bulan mei, dengan struktur tabel NAMA | BULAN
kolom bulan berisi jumlah uang yang dibayar, maka script nya adalah :

select nama, decode(bulan,5,jumlah) bulan
from tabel_2
where bulan=5

Kita perlu memfilter hanya bulan 5 yang dipanggil dengan perintah where agar data yang keluar hanya nama-nama yang mempunyai pembayaran bulan 5. jika kita tidak memfilternya maka seluruh data akan tampil, tetapi yang bukan pembayaran bulan 5 akan kosong.


Ini adalah tampilan dari script diatas
hanya dua nama yang muncul karena telah difilter bulan 5 saja.



Jika tidak difilter maka seluruh data akan ditampilkan, tapi yang bukan bukan 5 akan kosong.

Demikianlah penjelasan singkat tentang fungsi decode, pada prakteknya nanti fungsi ini dapat dipakai untuk pivot tabel, dll.