Tuesday, October 7, 2014

Mengenal Fungsi GROUP_CONCAT() di MySQL

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    9
Dan 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,9
Ya, 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, nim
Setelah 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, nim
dan 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, nim
Bagaimana hasilnya? Silahkan dicoba sendiri. :D
Semoga bermanfaat dan maju terus ilmu pengetahuan Indonesia.

Sumber : http://achmatim.net/2011/06/07/mengenal-fungsi-group_concat-di-mysql/

0 comments: