Pivot Table dengan MySQL + PHP Bagian 2
Kemarin kita sudah berhasil membuat query saatnya kita membuat laporan yang diminta oleh manager. Sekarang kita mulai melakukan pengkodean untuk tampilan hasil query tersebut dengan memanfaatkan PHP dan tentu saja HTML table.
Dalam artikel kali ini saya akan memanfaatkan mysqli extension untuk melakukan koneksi dengan database. Kepanjangan dari huruf i yang berada dibelakang mysql adalah improved dan pengembang PHP menyarankan menggunakan mysqli jika sudah menggunakan PHP 4.1.3 ke atas. Fitur yang ditambahkan seperti dukungan OOP, prepare statement, multiple statement dan transaction.
Berikut kodenya dan simpan dengan nama crosstab.php atau nama lain yang diinginkan.
<?php //membuat header HTML echo '<html>'; echo '<head>'; echo '<title>Cross Tabulation Example</title>'; echo '</head>'; echo '<body>'; //melakukan koneksi ke database, parameter disesuaikan dengan lingkungan anda $db_conn = new mysqli('localhost', 'root', '', 'dummy'); //check sebelum melanjutkan if($db_conn->connect_error) { echo '<p>Gagal menjalankan query. Aplikasi dihentikan</p>'; exit(); } //query yang telah dibuat $sql = "SELECT nama, desktop, web, desktop + web AS total_durasi FROM ( SELECT nama, SUM(IF(proyek = 'desktop',durasi,0)) AS desktop, SUM(IF(proyek = 'web', durasi, 0)) AS web FROM aktifitas GROUP BY nama WITH ROLLUP ) AS temp_table;"; //jalankan query dan akan menghasilkan mysqli result object $query = $db_conn->query($sql); //check apakah object query tercipta if($query) { //buat table echo '<table cellpadding="5" cellspacing="0" border="1" width="100%">'; echo '<thead>'; echo '<tr>'; echo '<th>Nama</th>'; echo '<th>Desktop</th>'; echo '<th>Web</th>'; echo '<th>Total Durasi / Nama</th>'; echo '</tr>'; echo '</thead>'; echo '<tbody>'; //ambil data per row while($row = $query->fetch_object()) { echo '<tr>'; echo '<td>'.$row->nama.'</td>'; echo '<td align="center">'.$row->desktop.'</td>'; echo '<td align="center">'.$row->web.'</td>'; echo '<td align="center">'.$row->total_durasi.'</td>'; echo '</tr>'; } echo '</tbody>'; echo '</table>'; //tutup query $query->close(); } else { echo '<p>Gagal menjalankan query. Aplikasi dihentikan</p>'; } //tutup koneksi $db_conn->close(); echo '</body>'; echo '</html>'; ?>
Kode di atas akan menghasilkan tampilan yang hampir persis dengan permintaan.
Ada yang kurang dari tabel di atas tadi yaitu total durasi yang terletak di bawah nama – nama tersebut. Untuk itu kita perlu mengubah sedikit query yang telah kita buat tadi menjadi
SELECT IFNULL(nama, 'Total Durasi') AS nama, desktop, web, desktop + web AS total_durasi FROM ( SELECT nama, SUM(IF(proyek = 'desktop',durasi,0)) AS desktop, SUM(IF(proyek = 'web', durasi, 0)) AS web FROM aktifitas GROUP BY nama WITH ROLLUP ) AS temp_table;
Kita lihat bahwa nama sekarang tidak lagi sekedar pemanggilan kolom nama, namun kita masukkan IFNULL untuk mengececk jika value / nilai dari kolom nama NULL maka akan diberikan nilai Total Durasi.
Ada kelemahannya jika kita ada nama yang isinya NULL. Untuk mengatasi hal ini bisa kita lakukan pengecekan pada PHP tapi tidak saya bahas. Karena pada saat pengembangan Table saya tidak mengijinkan NULL untuk nilai nama.
Selamat mencoba dan silahkan browsing lagi karena kerjaan udah kelar. hahaha.
Comments
awesome!
Mau tanya lebih jauh nih, Pak.
Bagaimana kalau nilai nama, proyek dan durasi masih berupa variable. Misalnya saya insert satu row pada table aktifitas dengan ‘Ari’, ‘Networking’, ‘200’. Bagaimana menampilkannya?
Waks, maaf saya kayaknya kelewat komentar mas :D.
Skema dan datanya asalnya dari sini http://www.nurasto.com/2011/11/04/pivot-table-dengan-mysql-php-bagian-1/. Laporan akan bergerak sesuai dengan penambahan data pada tabel aktifitas.
Mudah – mudahan benar jawaban saya terhadap pertanyaan mas.
Mau tanya,bagaimana biar objek yg ditunjuk seperti desktop / web itu dinamis? sebelumnya saya ucapkan terima kasih pak
Sederhananya, generasi SQL query untuk pivot dengan menggunakan PHP. Ambil data masternya untuk kategori proyek, sisipkan hasilnya di SQL Query. 🙂
terima kasih banyak pak
Sorry, comments are closed