Total Tayangan Halaman

Senin, 05 April 2010

CrossTab menggunakan MySQL (akhirnya ketemu juga)

Beberapa waktu yang lalu daku menemukan 'group_concat' (setelah sekian lama menggunakan MySQL), hasil dari cari-cari di internet. Ternyata ada kekuatan istimewa yang dari dulu tak cari-cari, yaitu bagaimana cara membuat crosstab menggunakan/via MySQL.

Langsung ajah, learning by doingnya:
misalnya ada tabel:
tabel: presensi
nama | tanggal | kehadiran
--------------------------------
fulan | 2010-04-01 | hadir
fulin | 2010-04-01 | hadir
fulan | 2010-04-02 | hadir
fulin | 2010-04-02 | tidak hadir

sebagai pemanasan, dengan memberikan query:
select nama, group_concat(distinct kehadiran) as status_kehadiran from presensi group by nama

maka akan muncul:
nama | status_kehadiran
--------------------------
fulan | hadir
fulin | hadir, tidak hadir


terus, bagaimana cara membuat jumlah kehadirannya?
nama | hadir | tidak hadir
---------------------------
fulan | 2 | 0
fulin | 1 | 1

di sini, kita akan menggunakan concat, group_concat dan prepared statement. akan tetapi, kita siapkan dulu, nanti kira-kira querynya seperti apa.
target:
select nama, sum(if(kehadiran='hadir',1,0)) as `hadir`, sum(if(kehadiran='tidak hadir'),1,0) as `tidak hadir` from presensi group by nama

kalau diperhatikan, ada beberapa sintaks yang diulang beberapa kali, yaitu:
sum(if(kehadiran='x',1,0)) as `x` , dengan x adalah keterangannya (hadir atau tidak hadir)

sehingga, sql di atas terpecah ke dalam 3 bagian yang nantinya akan digabung menggunakan concat(), yaitu:
bagian 1: select nama,
bagian 2: sum(if(kehadiran='x',1,0)) as `x` --> menggunakan group concat
bagian 3: from presensi group by nama

bagian 2 sendiri dibagi ke dalam 5 bagian, yaitu:
bagian 2.1: sum(if(kehadiran='
bagian 2.2: x
bagian 2.3: ',1,0)) as `
bagian 2.4: x
bagian 2.5: `

sehingga, syntaxnya berubah menjadi:
select @crosstab := concat("select nama,", group_concat(distinct concat("sum(if(kehadiran='", kehadiran, "',1,0)) as `", kehadiran,"`") separator ","), " from presensi group by nama") from presensi
prepare rekap_presensi from @crosstab
execute rekap_presensi
jika sudah selesai, eksekusi
deallocate prepare rekap_presensi

2 komentar:

didip sasmitoadi mengatakan...

sudah dicoba dengan studi kasus lainnya, ternyata string nya kepotong. akhirnya manual import ke access dan ngerjain cross tab nya via access. :)

Unknown mengatakan...

Misi, gan didip, tau gk cara menggunakan group_concat atau sejenis ny di microsoft acces.. Trmksh