Pivot Table dengan MySQL + PHP Bagian 2

Posted by Nurasto | November 5, 2011 | Software and Web Development | 5 Comments

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

  1. Arfi says:

    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?

  2. Faisal Kharis says:

    Mau tanya,bagaimana biar objek yg ditunjuk seperti desktop / web itu dinamis? sebelumnya saya ucapkan terima kasih pak

Sorry, comments are closed

Bit and Bytes

Hello. My name is Dityo Nurasto. I am working as freelance software and web developer.

This is my personal playground. Enjoy your stay and don't hesitate to send comments.

ShoutBox