Query : Membuat Baris Jadi Kolom

Beberapa kali saya sempat ditanya oleh beberapa teman tentang cara membuat baris (record) database menjadi kolom menggunakan SQL. Berikut ini saya berikan jawabannya (sesuai pengetahuan yang saya punya) barangkali dapat berguna bagi yang belum tau.
Contoh kasus :
Ada sebuah tabel pembeli dengan data sebagai berikut

Data tersebut ini dibuat ke dalam format sebagai berikut

Pada data asli, nilai 1,2, dan 3 adalah id_potongan yang berada pada baris(record) sedangkan hasil yang diharapkan adalah berupa penampilan data per potongan dan per pembeli untuk mengetahui besarnya masing – masing potongan bagi tiap pembeli. Lalu bagaimana mengubah 1,2, dan 3 yang tadi merupakan baris kemudian menjadi kolom ?

Langkah penyelesaian :

1. Klasifikasikan data sesuai kelompok potongannya dengan menggunakan operator “IF”

select id_pembeli,
if(id_potongan='1',potongan,0) as idpotongan_1,
if(id_potongan='2',potongan,0) as idpotongan_2,
if(id_potongan='3',potongan,0) as idpotongan_3
from belibeli

Perhatikan “if(id_potongan=’3′,jumlah,0) as idpotongan_3″. Baris perintah tersebut akan menghasilkan nilai field “potongan” jika  nilai recordnya memiliki id_potongan = 3 dan akan menghasilkan nilai 0 jika id_potongan pada record terkait tidak bernilai 3. Kenapa memilih angka 0 ? Pertanyaan ini akan terjawab pada langkah kedua.

Hasil dari query di atas sebagai berikut

Operator IF-lah yang paling berperan dalam membuat baris menjadi kolom. Namun cara ini memiliki keterbatasan yaitu jumlah kolomnya statis. Jika ada pertambahan data pada tabel referensi, maka querynya harus diubah juga. Misal, ada penambahan 1 jenis potongan. Maka query di atas harus ditambahi if(id_potongan=’4′,jumlah,0) as idpotongan_4 agar kelompok jenis potongannya menjadi 4.

2. Kelompokkan data per pembeli

Lihat hasil dari query pada langkah pertama. Hasil query itu masih belum dikelompokkan per pembeli. Perhatikan id_pembeli 023. Id_pembeli 023 pada baris pertama, kolom id_potongan1 bernilai 1000 dan pada kolom lainnya bernilai 0 karena pada data asli id_pembeli 023 pada baris pertama hanya mendapat potongan jenis 1. Begitu juga id_pembeli 023 pada baris kedua, kolom id_potongan2 bernilai 2000 dan pada kolom lainnya bernilai 0 karena pada data asli id_pembeli 023 pada baris kedua hanya mendapat potongan jenis 2. Sudah sesuai kan dengan data asli ?

Lalu bagaimana mengelompokkannya per pembeli ? Gunakan group by dengan aggregate function SUM untuk mengelompokkan hasil query pada langkah 1. Aggregate function yang digunakan adalah SUM sehingga nilai 0 yang kita gunakan pada langkah 1 tadi tidak berpengaruh.

select
id_pembeli,
sum(idpotongan_1) as satu,
sum(idpotongan_2) as dua,
sum(idpotongan_3) as tiga
from(
/*query langkah 1 yg dijadikan sebagai sub query*/
select
id_pembeli,
if(id_potongan='1',potongan,0) as idpotongan_1,
if(id_potongan='2',potongan,0) as idpotongan_2,
if(id_potongan='3',potongan,0) as idpotongan_3
from belibeli
)  as inti
group by id_pembeli

Hmmm … begitulah caranya. Ada yang tau cara yang lebih baik lagi ? Silakan …

5 thoughts on “Query : Membuat Baris Jadi Kolom

    • Saya kurang begitu tau karena tidak ada DB Oracle yang bisa saya pakai untuk mencoba, tapi sepertinya bisa karena hampir disemua DB sekarang dah support statement IF. Logikanya sama seperti itu, tinggal disesuaikan dengan bahasa SQL u masing2x DB saja. Misalnya saja kalo di SQL Server pakainya bukan IF, tapi CASE WHEN.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s