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. 😀

Semoga bermanfaat dan maju terus ilmu pengetahuan Indonesia.

Referensi

Berbagi itu indah...Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Pin on Pinterest0Digg this

26 comments

  1. terima kasih pak…. sangat bermanfaat sekali segera di coba dan mencoba mengembangkan ya…. thanks

  2. maaf pak saya mau tanya, kalau perintah select lebih dari 3 database di mysql gimana ya pak ?
    terimakasih …

  3. tutorial yang bagus Pak.
    tapi saya ada satu pertanyaan.
    bagaimana  cara variasi query jika ingin menampilkan data yang paling terakhir diinput??
    misal seperti contoh di atas jika saya hanya ingin menampilkan  2011001 | 101     | 8,8,7 |
    kode dibawah ini sudah saya coba utak atik menjadi

    SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC SEPARATOR ‘,’) as nilai
    FROM tab_ulangan GROUP BY kdMapel, nim
    menjadi

    SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC LIMIT 1 SEPARATOR ‘,’) as nilai
    FROM tab_ulangan GROUP BY kdMapel, nim
    tapi tidak berhasil…malah tampilannya kosong
    mohon bantuaanya ya Pak Dosen..:-)

  4. to achmatin: mas saya sudah dapat jawaban dari pertanyaan saya sendiri.setelah saya utak-atik codingnya ternyata saya ada salah penempatan Coding

    Awalnya

    SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai DESC LIMIT 1 SEPARATOR ‘,’) as nilai
    FROM tab_ulangan GROUP BY kdMapel, nim

    seharusya Coding yang saya garis bawah berada pada

    SELECT nim, kdMapel, GROUP_CONCAT(nilai ORDER BY nilai  SEPARATOR ‘,’) as nilai
    FROM tab_ulangan GROUP BY kdMapel, nim order by nim DESC LIMIT 1

    T’x buat tutorial Group_concat() nya..

  5. Terima kasih bayak pa…saya adalah pengguna pemula dan sangat awam untuk database menggunakan mysql, walaupun saya sangat mahir menggunakan visual foxpro, namun ternyata dunia kerja menuntut mysql, oleh karena itu aku terpaksa harus belajar lagi…

  6. Thaks byk pa…aku sangat awam dengan program database dengan menggunakan mysql, walaupuan saya mahir menggunakan visual foxpro, namun ternyata dunia kerja menuntut dan rata2 menuntut untuk menggunakan mysql, oleh karena itu terpaksa aku belajar lagi…..thaks byk untuk penjelasannya…
     
    salam..
     
     
    Stanly Making

  7. Sangat jelas sekali pak,
    untuk kolom nilai bisa dibuat perkolom? jadi nilai 1 = 70 nilai 2 = 80,
    juga tidak ada nilainya, bisa di isi dengan text “belum ujian”
    bagaimana query nya pak?

Leave a Reply

Your email address will not be published. Required fields are marked *