Desember 10, 2014

Query Pivot/CrossTab Tabel Dinamis pada MySQL

Pada postingan ini saya ingin berbagi tentang Pivot/CrossTab Tabel Dinamis, Bukan Transpose Tabel pada MS Excel yang dengan mudah tinggal Paste Special-Transpose, tapi ini pada MySQL. Langsung aja mulai...

Pada MySQL mempunyai Tabel seperti ini :

Sedangkan yang dibutuhkan hasilnya seperti ini :


Script Tabel Nilai
--
-- Table structure for table `Nilai`
--

DROP TABLE IF EXISTS `Nilai`;
CREATE TABLE `Nilai` (
  `ID_NILAI` int(11) NOT NULL,
  `SISWA` varchar(45) NOT NULL,
  `MATA_PELAJARAN` varchar(45) NOT NULL,
  `KELAS` varchar(10) NOT NULL,
  `NILAI_AKHIR` int(11) DEFAULT '0',
  PRIMARY KEY (`ID_NILAI`,`SISWA`,`MATA_PELAJARAN`,`KELAS`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `Nilai`
--

INSERT INTO `Nilai` VALUES 
(1,'BUDI','KOMPUTER','IA',80),(2,'ANI','KOMPUTER','IA',70),
(3,'ACENG','BAHASA INDONESIA','IA',90),(4,'BUDI','BAHASA INDONESIA','IA',80),
(5,'ANI','BAHASA INDONESIA','IA',85),(6,'ACENG','KOMPUTER','IA',70),
(7,'BUDI','FISIKA','IA',80),(8,'ACENG','FISIKA','IA',80),
(9,'ACENG','FISIKA','IA',87),(10,'JONO','KOMPUTER','IIA',80),
(11,'JOKO','KOMPUTER','IIA',78),(12,'DEKO','KOMPUTER','IIA',95);

Berikut Script MySQL-nya untuk membuat CrossTab yang dinamis
SET @sql = NULL;

SELECT
GROUP_CONCAT(DISTINCT
CONCAT(

'MAX(case when `MATA_PELAJARAN` = ''',
`MATA_PELAJARAN`,
''' then NILAI_AKHIR end) AS `',
`MATA_PELAJARAN`,
'`'
)
ORDER BY MATA_PELAJARAN, SISWA ASC SEPARATOR ',\n'
) INTO @sql
from Nilai;

SET @sql = CONCAT('SELECT ID_NILAI, SISWA, KELAS,', 
@sql, 'from Nilai GROUP BY ID_NILAI, SISWA, KELAS');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Silahkan unduh Source-nya disini
https://drive.google.com/file/d/0B1wwNkjrVkW4WXlsMTctY1Y2NzQ/view?usp=sharing

0 comments:

Posting Komentar

 
Copyright © 2014 by Eryck Gusdian - javabego