Beberapa hari yang lalu saya mendapat pertanyaan menarik melalui email dari salah satu pengunjung situs Achmatim.Net
yang berasal dari Magelang. Si Penanya mengalami kesulitan dalam
menampilkan daftar nilai siswa/mahasiswa dalam satu field yang
dikelompokkan berdasarkan NIM (nomor induk mahasiswa) dan mata
pelajarannya. Mendapat pertanyaan tersebut, saya langsung tertuju ke
satu fungsi di MySQL, yaitu GROUP_CONCAT(). Berikut ini pembahasan selengkapnya.
Sebagai gambaran, penanya memberikan suatu tabel dan isi datanya sebagai berikut:
NIM kdMapel testKe Nilai 2011001 101 01 8 2011002 101 01 7 2011003 101 01 6 2011001 102 01 9 2011002 102 01 8 2011003 102 01 7 2011001 101 02 7 2011002 101 02 7 2011003 101 02 9 2011001 101 03 8 2011002 101 03 8 2011003 101 03 9 2011001 102 02 7 2011002 102 02 8 2011003 102 02 9Dan tampilan yang diinginkan adalah sebagai berikut:
NIM kdMapel Nilai 2011001 101 8,7,8 2011002 101 7,7,8 2011003 101 6,7,9 2011001 102 9,7 2011002 102 8,8 2011003 102 7,9Ya, seperti yang sudah saya sebutkan di atas, kita dapat menyelesaikannya dengan mudah menggunakan fungsi GROUP_CONCAT(). Menurut manual MySQL, fungsi ini dapat digunakan untuk menghasilkan suatu string dari beberapa isi record berdasarkan pengelompokkan tertentu. Seperti pada kasus di atas, bahwa yang diinginkan adalah nilai ditampilkan secara mendatar berdasarkan pengelompokkan NIM dan kdMapel.
Sebelum mencoba fungsi GROUP_CONCAT(), kita akan mencoba melakukan grouping terlebih dahulu dengan perintah SQL sebagai berikut:
SELECT nim,kdMapel,nilai FROM tab_ulangan GROUP BY kdMapel, nimSetelah dijalankan, ternyata hasilnya masih belum sempurna. Memang sudah terjadi pengelompokkan berdasarkan kdMapel dan nim, namun nilai yang ditampilkan hanya satu nilai. Berikut ini hasilnya:
+---------+---------+-------+ | nim | kdMapel | nilai | +---------+---------+-------+ | 2011001 | 101 | 8 | | 2011002 | 101 | 7 | | 2011003 | 101 | 6 | | 2011001 | 102 | 9 | | 2011002 | 102 | 8 | | 2011003 | 102 | 7 | +---------+---------+-------+ 6 rows in set (0.00 sec)Nah, dengan menggunakan fungsi GROUP_CONCAT() kita akan menghasilkan tampilan yang berbeda. Perhatikan perintah query berikut ini:
SELECT nim, kdMapel, GROUP_CONCAT(nilai SEPARATOR ',') as nilai FROM tab_ulangan GROUP BY kdMapel, nimdan hasilnya sebagai berikut:
+---------+---------+-------+ | nim | kdMapel | nilai | +---------+---------+-------+ | 2011001 | 101 | 8,8,7 | | 2011002 | 101 | 8,7,7 | | 2011003 | 101 | 9,6,9 | | 2011001 | 102 | 9,7 | | 2011002 | 102 | 8,8 | | 2011003 | 102 | 7,9 | +---------+---------+-------+ 6 rows in set (0.00 sec)Mudah bukan??
Jika diinginkan, kita juga bisa melakukan pengurutan nilai tersebut dengan menambahkan ORDER BY. Selain itu, juga kita juga dapat menambahkan DISTINCT untuk mencegah duplikasi data nilai. Berikut ini contoh variasi query yang ditambahkan pengurutan data berdasarkan nilai yang terbesar.
SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC SEPARATOR ',') as nilai FROM tab_ulangan GROUP BY kdMapel, nimBagaimana hasilnya? Silahkan dicoba sendiri.
Semoga bermanfaat dan maju terus ilmu pengetahuan Indonesia.
Sumber : http://achmatim.net/2011/06/07/mengenal-fungsi-group_concat-di-mysql/
0 comments:
Post a Comment