Sayangnya MySQL tidak memiliki fungsi
Lihat SQL Fiddle dengan Demo Karena Anda tidak tahu Produk, Anda mungkin ingin melakukan ini secara dinamis. Ini dapat dilakukan dengan menggunakan pernyataan yang disiapkan. Tabel pivot dinamis (mengubah baris menjadi kolom) Kode Anda akan terlihat seperti ini:
Lihat SQL Fiddle dengan Demo Mungkin perlu dicatat bahwa Bulan lalu dapat tugas buat menampilkan data yang beberapa jumlah kolomnya dinamis menggunakan dB SQL Server yang melibatkan beberapa tabel, setelah berhasil pada SQL Server akhirnya sekalian nyoba juga pada dB MySQL. Istilahnya dikenal dengan pivot table. Desain dB yang digunakan pada contoh ini adalah : Table Pivot pada MySQLBuat dulu beberapa tabel di dB yang diperlukan untuk mendukung query tersebut. Buat tabel Pelajaran, Kelas, Peserta dan Peserta_has_Pelajaran dengan syntax berikut : -- ----------------------------------------------------- -- Table `Pelajaran` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Pelajaran` ( `idPelajaran` VARCHAR(3) NOT NULL, `NamaPelajaran` VARCHAR(45) NULL, `Keterangan` VARCHAR(50) NULL, PRIMARY KEY (`idPelajaran`)); -- ----------------------------------------------------- -- Table `kelas` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `kelas` ( `kodeKelas` INT NOT NULL, `NamaKelas` VARCHAR(15) NULL, PRIMARY KEY (`kodeKelas`)); -- ----------------------------------------------------- -- Table `Peserta` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Peserta` ( `IdPeserta` VARCHAR(3) NOT NULL, `NamaPeserta` VARCHAR(45) NULL, `kelas_kodeKelas` INT NOT NULL, PRIMARY KEY (`IdPeserta`), INDEX `fk_Perserta_kelas1_idx` (`kelas_kodeKelas` ASC), CONSTRAINT `fk_Perserta_kelas1` FOREIGN KEY (`kelas_kodeKelas`) REFERENCES `kelas` (`kodeKelas`) ON DELETE NO ACTION ON UPDATE NO ACTION); -- ----------------------------------------------------- -- Table `Peserta_has_Pelajaran` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Peserta_has_Pelajaran` ( `Peserta_IdPeserta` VARCHAR(3) NOT NULL, `Pelajaran_idPelajaran` VARCHAR(3) NOT NULL, PRIMARY KEY (`Peserta_IdPeserta`, `Pelajaran_idPelajaran`), INDEX `fk_Peserta_has_Pelajaran_Pelajaran1_idx` (`Pelajaran_idPelajaran` ASC), INDEX `fk_Peserta_has_Pelajaran_Perserta_idx` (`Peserta_IdPeserta` ASC), CONSTRAINT `fk_Peserta_has_Pelajaran_Perserta` FOREIGN KEY (`Peserta_IdPeserta`) REFERENCES `Peserta` (`IdPeserta`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_Peserta_has_Pelajaran_Pelajaran1` FOREIGN KEY (`Pelajaran_idPelajaran`) REFERENCES `Pelajaran` (`idPelajaran`) ON DELETE NO ACTION ON UPDATE NO ACTION); Isi tabel dengan beberapa baris data : INSERT INTO `pelajaran` VALUES ('001','Matematika', null); INSERT INTO `pelajaran` VALUES ('002', 'Kimia', null); INSERT INTO `pelajaran` VALUES ('003', 'Fisika', null); INSERT INTO `pelajaran` VALUES('004', 'Bhs Arab', null); INSERT INTO `kelas` VALUES ('7', 'VII'); INSERT INTO `kelas` VALUES ('8', 'VIII'); INSERT INTO `kelas` VALUES ('9', 'IX'); INSERT INTO `peserta` VALUES ('001', 'orang1', '7'); INSERT INTO `peserta` VALUES ('002', 'orang2', '8'); INSERT INTO `peserta` VALUES ('003', 'orang3', '9'); INSERT INTO `peserta` VALUES ('004', 'orang4', '7'); INSERT INTO `peserta` VALUES ('005', 'orang5', '8'); INSERT INTO `peserta` VALUES ('006', 'orang6', '9'); INSERT INTO `peserta` VALUES ('007', 'orang7', '9'); INSERT INTO `peserta` VALUES ('008', 'orang8', '7'); INSERT INTO `peserta` VALUES ('009', 'orang9', '7'); INSERT INTO `peserta_has_pelajaran` VALUES ('001', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('001', '003'); INSERT INTO `peserta_has_pelajaran` VALUES ('002', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('002', '002'); INSERT INTO `peserta_has_pelajaran` VALUES ('003', '003'); INSERT INTO `peserta_has_pelajaran` VALUES ('003', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('004', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('004', '002'); INSERT INTO `peserta_has_pelajaran` VALUES ('004', '003'); INSERT INTO `peserta_has_pelajaran` VALUES ('005', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('006', '003'); INSERT INTO `peserta_has_pelajaran` VALUES ('007', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('007', '003'); INSERT INTO `peserta_has_pelajaran` VALUES ('008', '003'); INSERT INTO `peserta_has_pelajaran` VALUES ('009', '001'); INSERT INTO `peserta_has_pelajaran` VALUES ('009', '002'); INSERT INTO `peserta_has_pelajaran` VALUES ('009', '003'); Selanjutnya adalah membuat query agar hasil akhirnya seperti berikut :
Deklarasikan dulu variable di session yang akan menyimpan sql query sementara : set @dinamicPivotQuery = NULL; Dapatkan semua nama-nama kolom yang ingin ditampilkan secara dinamis, dalam contoh ini nama-nama pelajaran(pj.NamaPelajaran) yang ada di table pelajaran dan isi kolomnya merupakan jumlah pelajar (p.jum) yang mengikuti pelajaran tersebut : Select group_concat( distinct concat( 'MAX(if(p.NamaPelajaran = ''', pj.NamaPelajaran, ''', p.jum, 0)) AS ''', pj.NamaPelajaran, '''' ) ) INTO @dinamicPivotQuery from pelajaran pj; Sebelum memabangun pivot-nya. Kita buat dulu sub query (k) yang menampilkan kelas dan total pesertanya : SELECT p.kelas_kodeKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM peserta p left outer join peserta_has_pelajaran php on p.IdPeserta = php.Peserta_IdPeserta Group By p.kelas_kodeKelas Selanjutnya sub query (p) yang menampilkan kelas, pelajaran dan jumlah pesertanya : SELECT k.NamaKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM kelas k left outer join peserta p ON k.kodeKelas = p.kelas_kodeKelas left outer join peserta_has_pelajaran php ON p.IdPeserta = php.Peserta_IdPeserta group by k.kodeKelas Terakhir adalah menggabungkan sub-sub query menjadi satu query yang akan disimpan di variabel dinamicPivotQuery yang sudah dibuat sebelumnya : SET @dinamicPivotQuery = CONCAT( 'Select p.NamaKelas as Kelas, jumPeserta as TotalPeserta, ', @dinamicPivotQuery, ' from( SELECT k.NamaKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM kelas k left outer join peserta p on k.kodeKelas=p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta = php.Peserta_IdPeserta group by k.kodeKelas ) k left outer join ( select k.kodeKelas, k.NamaKelas, pj.NamaPelajaran, count(p.IdPeserta) as jum from kelas k left outer join peserta p on k.kodeKelas = p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta=php.Peserta_IdPeserta left outer join pelajaran pj on php.Pelajaran_idPelajaran=pj.idPelajaran group by k.NamaKelas, pj.NamaPelajaran ) p on k.NamaKelas=p.NamaKelas GROUP BY p.kodeKelas' ); Jika ditampilkan isi dari dinamicPivotQuery adalah : Select p.NamaKelas as Kelas, jumPeserta as TotalPeserta, MAX(if(p.NamaPelajaran = 'Matematika', p.jum, 0)) AS 'Matematika', MAX(if(p.NamaPelajaran = 'Kimia', p.jum, 0)) AS 'Kimia', MAX(if(p.NamaPelajaran = 'Fisika', p.jum, 0)) AS 'Fisika', MAX(if(p.NamaPelajaran = 'Bhs Arab', p.jum, 0)) AS 'Bhs Arab' From ( SELECT k.NamaKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM kelas k left outer join peserta p on k.kodeKelas=p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta = php.Peserta_IdPeserta group by k.kodeKelas ) k left outer join ( select k.kodeKelas, k.NamaKelas, pj.NamaPelajaran, count(p.IdPeserta) as jum from kelas k left outer join peserta p on k.kodeKelas = p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta=php.Peserta_IdPeserta left outer join pelajaran pj on php.Pelajaran_idPelajaran=pj.idPelajaran group by k.NamaKelas, pj.NamaPelajaran ) p on k.NamaKelas=p.NamaKelas GROUP BY p.kodeKelas Dan untuk mendapatkan hasil query pivot table kita jalankan isi variable dinamicPivotQuery : PREPARE stmt FROM @dinamicPivotQuery; EXECUTE stmt; DEALLOCATE PREPARE stmt; Dimana PREPARE adalah menyiapkan statement yang akan dieksekusi; EXECUTE adalah untuk menjalankan statement yang sudah disiapkan pada PREPARE;
DEALLOCATE PREPARE adalah untuk membebaskan statement setelah dieksekusi, ini sebenarnya tidak perlu kita tuliskan lagi, karena sudah secara default di-dealokasi oleh server. Table Pivot pada SQL ServerBuat table yang butuhkan : -- ----------------------------------------------------- -- Table `Pelajaran` -- ----------------------------------------------------- CREATE TABLE Pelajaran ( idPelajaran VARCHAR(3) NOT NULL, NamaPelajaran VARCHAR(45) NULL, Keterangan VARCHAR(50) NULL, Constraint PK_Pelajaran PRIMARY KEY (idPelajaran)) go -- ----------------------------------------------------- -- Table `kelas` -- ----------------------------------------------------- CREATE TABLE kelas ( kodeKelas INT NOT NULL, NamaKelas VARCHAR(15) NULL, Constraint PK_kelas PRIMARY KEY (kodeKelas)) go -- ----------------------------------------------------- -- Table `Peserta` -- ----------------------------------------------------- CREATE TABLE Peserta ( IdPeserta VARCHAR(3) NOT NULL, NamaPeserta VARCHAR(45) NULL, kelas_kodeKelas INT NOT NULL, Constraint PK_Peserta PRIMARY KEY (IdPeserta) ) go create INDEX fk_Perserta_kelas1_idx on Peserta (kelas_kodeKelas ASC) go alter table Peserta add CONSTRAINT fk_Perserta_kelas1 FOREIGN KEY (kelas_kodeKelas) REFERENCES kelas (kodeKelas) go -- ----------------------------------------------------- -- Table `Peserta_has_Pelajaran` -- ----------------------------------------------------- CREATE TABLE Peserta_has_Pelajaran ( Peserta_IdPeserta VARCHAR(3) NOT NULL, Pelajaran_idPelajaran VARCHAR(3) NOT NULL, constraint PK_PHP PRIMARY KEY (Peserta_IdPeserta, Pelajaran_idPelajaran)) go create INDEX fk_Peserta_has_Pelajaran_Pelajaran1_idx on Peserta_has_Pelajaran (Pelajaran_idPelajaran ASC) go create INDEX fk_Peserta_has_Pelajaran_Perserta_idx on Peserta_has_Pelajaran (Peserta_IdPeserta ASC) go alter table Peserta_has_Pelajaran add CONSTRAINT fk_Peserta_has_Pelajaran_Perserta FOREIGN KEY (Peserta_IdPeserta) REFERENCES Peserta (IdPeserta) go alter table Peserta_has_Pelajaran add CONSTRAINT fk_Peserta_has_Pelajaran_Pelajaran1 FOREIGN KEY (Pelajaran_idPelajaran) REFERENCES Pelajaran (idPelajaran) go Isi tabel dengan beberapa baris data : INSERT INTO Pelajaran VALUES ('001','Matematika', null); INSERT INTO Pelajaran VALUES ('002', 'Kimia', null); INSERT INTO Pelajaran VALUES ('003', 'Fisika', null); INSERT INTO Pelajaran VALUES('004', 'Bhs Arab', null); INSERT INTO Kelas VALUES ('7', 'VII'); INSERT INTO Kelas VALUES ('8', 'VIII'); INSERT INTO Kelas VALUES ('9', 'IX'); INSERT INTO Peserta VALUES ('001', 'orang1', '7'); INSERT INTO Peserta VALUES ('002', 'orang2', '8'); INSERT INTO Peserta VALUES ('003', 'orang3', '9'); INSERT INTO Peserta VALUES ('004', 'orang4', '7'); INSERT INTO Peserta VALUES ('005', 'orang5', '8'); INSERT INTO Peserta VALUES ('006', 'orang6', '9'); INSERT INTO Peserta VALUES ('007', 'orang7', '9'); INSERT INTO Peserta VALUES ('008', 'orang8', '7'); INSERT INTO Peserta VALUES ('009', 'orang9', '7'); INSERT INTO Peserta_has_Pelajaran VALUES ('001', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('001', '003'); INSERT INTO Peserta_has_Pelajaran VALUES ('002', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('002', '002'); INSERT INTO Peserta_has_Pelajaran VALUES ('003', '003'); INSERT INTO Peserta_has_Pelajaran VALUES ('003', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('004', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('004', '002'); INSERT INTO Peserta_has_Pelajaran VALUES ('004', '003'); INSERT INTO Peserta_has_Pelajaran VALUES ('005', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('006', '003'); INSERT INTO Peserta_has_Pelajaran VALUES ('007', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('007', '003'); INSERT INTO Peserta_has_Pelajaran VALUES ('008', '003'); INSERT INTO Peserta_has_Pelajaran VALUES ('009', '001'); INSERT INTO Peserta_has_Pelajaran VALUES ('009', '002'); INSERT INTO Peserta_has_Pelajaran VALUES ('009', '003'); Sekarang kita mulai membuat query pivot tabel. DECLARE @dinamicPivotQuery as NVARCHAR(MAX); DECLARE @namaKoloms as NVARCHAR(MAX); DECLARE @namaKolomsNotNull as NVARCHAR(MAX); Buat query untuk mengisi nama- nama kolom pivot yang merupakan nama-nama mata pelajaran (Pelajaran.NamaPelajaran) : Select @namaKoloms = ISNULL(@namaKoloms+', ','') + QUOTENAME(NamaPelajaran), @namaKolomsNotNull = ISNULL(@namaKolomsNotNull+',','')+ 'COALESCE('+QUOTENAME(NamaPelajaran)+', 0) as '+ QUOTENAME(NamaPelajaran) From (Select distinct idPelajaran, NamaPelajaran From Pelajaran) as MataPelajaran; Sebelum memabangun pivot-nya. Kita buat dulu sub query (k) yang menampilkan nama kelas dan total pesertanya : SELECT p.kelas_kodeKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM peserta p left outer join peserta_has_pelajaran php on p.IdPeserta = php.Peserta_IdPeserta Group By p.kelas_kodeKelas Selanjutnya sub query (p) yang menampilkan kelas, pelajaran dan jumlah pesertanya : SELECT k.kodeKelas, k.NamaKelas, pj.NamaPelajaran, count(p.IdPeserta) as jum FROM kelas k left outer join peserta p on k.kodeKelas = p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta=php.Peserta_IdPeserta left outer join pelajaran pj on php.Pelajaran_idPelajaran=pj.idPelajaran Group By k.kodeKelas, k.NamaKelas, pj.NamaPelajaran Terakhir adalah menggabungkan sub-sub query menjadi 1 query dan membangun pivot table yang akan disimpan di variabel dinamicPivotQuery yang sudah dibuat sebelumnya : SET @dinamicPivotQuery=N'Select NamaKelas as Kelas, jumPeserta as TotalPeserta, ' + @namaKolomsNotNull + ' from ( Select NamaKelas, jumPeserta, NamaPelajaran, jum, kodeKelas From ( SELECT p.kelas_kodeKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM peserta p left outer join peserta_has_pelajaran php on p.IdPeserta = php.Peserta_IdPeserta group by p.kelas_kodeKelas ) k left outer join ( SELECT k.kodeKelas, k.NamaKelas, pj.NamaPelajaran, count(p.IdPeserta) as jum FROM kelas k left outer join peserta p on k.kodeKelas = p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta=php.Peserta_IdPeserta left outer join pelajaran pj on php.Pelajaran_idPelajaran=pj.idPelajaran Group By k.kodeKelas, k.NamaKelas, pj.NamaPelajaran ) p On k.kelas_kodeKelas = p.kodeKelas ) rekap PIVOT (SUM(jum) FOR NamaPelajaran IN(' + @namaKoloms + ')) as pvtTable Order By kodeKelas' ; Jika ditampilkan isi dari dinamicPivotQuery adalah : Select NamaKelas as Kelas, jumPeserta as TotalPeserta, COALESCE([Matematika], 0) as [Matematika], COALESCE([Kimia], 0) as [Kimia], COALESCE([Fisika], 0) as [Fisika],COALESCE([Bhs Arab], 0) as [Bhs Arab] from ( Select NamaKelas, jumPeserta, NamaPelajaran, jum, kodeKelas From ( SELECT p.kelas_kodeKelas, count(php.Peserta_IdPeserta) as jumPeserta FROM peserta p left outer join peserta_has_pelajaran php on p.IdPeserta = php.Peserta_IdPeserta group by p.kelas_kodeKelas ) k left outer join ( SELECT k.kodeKelas, k.NamaKelas, pj.NamaPelajaran, count(p.IdPeserta) as jum FROM kelas k left outer join peserta p on k.kodeKelas = p.kelas_kodeKelas left outer join peserta_has_pelajaran php on p.IdPeserta=php.Peserta_IdPeserta left outer join pelajaran pj on php.Pelajaran_idPelajaran = pj.idPelajaran Group By k.kodeKelas, k.NamaKelas, pj.NamaPelajaran ) p On k.kelas_kodeKelas = p.kodeKelas ) rekap PIVOT (SUM(jum) FOR NamaPelajaran IN([Matematika], [Kimia], [Fisika], [Bhs Arab])) as pvtTable Order By kodeKelas Dan untuk mendapatkan hasil query pivot table kita jalankan isi variable dinamicPivotQuery : EXEC sp_executesql @dinamicPivotQuery; Dan jika dijalankan hasilnya adalah : Selesai… Semoga bermanfaat ~{^v^}~ |