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.

1 komentar:

  1. Sign up in Betway 카지노사이트 카지노사이트 カジノ シークレット カジノ シークレット 149mlb tips today free spins no deposit bonus codes

    BalasHapus