Menampilkan semua tanggal pada hasil query mysql

Sebelumnya saya bingung mau memberi judul apa yang pas untuk tulisan saya berikut ini. Penjelasan kasusnya misalnya kita ingin membuat statistik kunjungan sebuah puskesmas. Puskesmas biasanya hanya buka pada jam kerja dari Senin sampai Jum’at belum termasuk libur Nasional. Artinya tidak setiap hari data kunjungan pasien ada. Ilustrasinya tabel kunjungan adalah sebagai berikut

id : integer, tgl_periksa : datetime

Kasusnya, kita ingin menampilkan semua tanggal yang tidak tercantum didalam kolom tgl_periksa dan menjumlah berapa pasien yang berkunjung dalam hari tersebut,contohnya pada tanggal 30-03-2012 seharusnya berjumlah 2 kunjungan, dan pada tanggal 27-03-2012 seharusnya baris tersebut muncul (walau tidak ada input data pada tanggal tersebut) dengan jml kunjungan 0.

Setelah ber-googling ria beberapa solusi didapatkan. Diantaranya ada yang membuat stored procedure untuk membuat tabel baru berisikan data tanggal antara tahun yang telah ditentukan. Namun bagi saya hal ini aga menyusahkan, yang pertama saya kurang memahami stored procedure dan yang kedua tabel yag dibuat tadi mempunyai rentang. Apabila rentang habis harus dibuat manual atau kalau rentangnya terlalu besar akan membebani tabel (CMIIW).

Solusi yang saya rasa cocok untuk kasus ini saya dapatkan dari stackoverflow.com dengan title masalah : “wanted to get all dates in mysql result”. Ini yang akan saya kupas di topik ini.

Hasil output query yang kita inginkan adalah seperti ini
result

Seperti hasil yang dilihat, maka pada tanggal tidak ada kunjungan akan otomatis di generate dengan jml = 0. Querynya adalah sbb :

SELECT tgl, COUNT(psid) AS jmlpasien FROM ( SELECT adddate((select min(date(tgl_periksa)) from tb_periksa), row-1) as tgl FROM ( SELECT @row := @row + 1 as row FROM (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t, (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, (SELECT @row:=0) r ) n WHERE n.row <= (select datediff(max(date(tgl_periksa)), min(date(tgl_periksa))) from tb_periksa) + 1 ) dr LEFT JOIN tb_periksa u ON dr.tgl = date(u.tgl_periksa) GROUP BY dr.tgl

Untuk penjelasan querynya bisa anda rujuk dari sumbernya di stackoverflow.com. Kemudian pertanyaanya bagaimana bila kita hanya ingin menampilkan data bulan atau tahun tertentu saja. Maka kita perlu sedikit melakukan modifikasi pada querynya. Misal kita hanya ingin menampilkan data pada bulan Maret 2012, maka querynya kita modifikasi sbb :

SELECT tgl, COUNT(psid) AS jmlpasien
FROM ( SELECT adddate((select min(date(tgl_periksa)) from tb_periksa WHERE month(tgl_periksa)=3 AND year(tgl_periksa)=2012), row-1) as tgl
FROM ( SELECT @row := @row + 1 as row
FROM (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, (SELECT @row:=0) r ) n
WHERE n.row <= (select datediff(max(date(tgl_periksa)), min(date(tgl_periksa)))
from tb_periksa WHERE month(tgl_periksa)=3 AND year(tgl_periksa)=2012) + 1 ) dr LEFT JOIN tb_periksa u ON dr.tgl = date(u.tgl_periksa)
GROUP BY dr.tgl

Hasilnya adalah sebagai berikut

result2

Anda juga bisa bereksperimen dengan elemen GET untuk perintah mamanggil data dari form, atau memakai operasi BETWEEN untuk memanggil rentang data pada perintah SQL.

Selamat mencoba 🙂

Iklan

Ternyata port e-sata bisa untuk usb

Laptop kesayangan-ku ternyata termasik kedalam kategori fakir usb. Port usb cuman ada 2, 1 port hdmi, 1 port e-sata. Berawal dari ketidak sengajaan teman dalam memasukkan port usb ke e-sata, ternyata port tersebut bisa tersambung. Kemudian aku coba memasukkan usbdrive ke port e-sata ternyata juga tidak ada masalah. Terakhir aku coba modem smart di colokan e-sata, eh ternyata sukses juga. Saat update blog ini, menggunakan modem smart yang dicolokkan ke port e-sata. Jadi sekarang sudah tidak fakir usb lagi he3

Jquery : Show Hide Div menggunakan combo box

Tulisan kali ini akan mengulas mengenai Jquery. Pada dasarnya saya tidak mahir tentang jquery, hanya end user saja. Ada banyak sekali teknik yang terkait dengan show/hide sebuah tag div menggunakan jquery, tetapi setelah 2 hari surving ternyata belum menemui jawaban memuaskan untuk show/hide tag div dengan trigger dari combo box, sehingga dengan sedikit trial error, akhirnya bisa juga 🙂

Seperti biasa saya gunakan editor kesayangan dreamweaver, langkahnya

  1. Download jquery versi terakhir dan simpan dalam site direktori (terserah anda, dalam kasus saya, saya simpan file jquery di folder scripts).
  2. Buat sebuah combo box dengan id=menucombo. Selanjutnya tentukan value-nya dengan menekan tombol list value di property bar. Misal seperti ini
  3. Buat juga sebuah text area yang diapit tag div dengan id=area
  4. Buka source code view dan sisipkan script berikut di dalam tag <head>
  5. <script src=”../scripts/jquery-1.4.4.min.js”></script>
    <script>
    $(document).ready(function() {
    $(“#area”).css(“display”,”none”);
    $(“select#menucombo”).click(function() {
    if($(this).val() !== “tampil”){
    $(“#area”).hide(“slow”);
    }else{
    $(“#area”).show(“slow”);
    }
    });
    });</script>
  6. Selesai

Keterangan

$(“#area”).css(“display”,”none”); –> mengkondisikan textarea yang diapit tag div id=area untuk tidak ditampilkan.

$(“select#menucombo”).click(function() –> aktivasi perintah di menu combo box terjadi bila ada pemilihan dan trigger “click”

if($(this).val() !== “tampil”){
$(“#area”).hide(“slow”);
}else{
$(“#area”).show(“slow”);
}

–> menjelaskan bahwa jika value dari combo box TIDAK memiliki nilai “tampil” maka tag div id=area disembunyikan, bila tidak maka tag div id=area ditampilkan

Kode selengkapnya seperti ini

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml”&gt;
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
<title>Untitled Document</title>
<script src=”../scripts/jquery-1.4.4.min.js”></script>
<script>
$(document).ready(function() {
$(“#area”).css(“display”,”none”);
$(“select#menucombo”).click(function() {
if($(this).val() !== “tampil”){
$(“#area”).hide(“slow”);
}else{
$(“#area”).show(“slow”);
}
});
});

</script>
</head>

<body>
<form id=”form1″ name=”form1″ method=”post” action=””>
<select name=”menucombo” id=”menucombo”>
<option selected=”selected”>–pilih–</option>
<option value=”tampil”>tampil</option>
<option value=”hilang”>hilang</option>
</select>
<br />
<textarea name=”area” id=”area”></textarea>
</form>
</body>
</html>

Mudah-mudahan yang sedikit ini bermanfaat. Thx

Format tanggal (date) di PHP dan MySQL melalui Dreamweaver

Sebenarnya sudah banyak artikel seputar manipulasi format tanggal baik di PHP maupun MySQL, tapi tak apalah siapa tahu tulisan kecil inipun bisa membantu teman-teman. Secara default, MySQL menyimpan data ‘date’ dalam format ‘yyyy-mm-dd’. Untuk merubah format tanggal tersebut bisa kita lakukan dengan merubah format di MySQL, namun cara ini tidak saya bahas, karena menurut saya lebih fleksibel kalau kita menyiasati format tampilan di sisi client.

Misal kita sudah menyiapkan tabel dengan salah satu kolom bernama ‘tgl’ dengan format kolom ‘date’, dan kita membuat recordset misal dengan nama ‘panggiltgl_rec’. Untuk merubah format tgl tersebut, kita bisa menggunakan fungsi strtotime.

  1. Misal kita ingin menampilkan format ‘dd-mm-yyyy’ maka cara memanggilnya adalah <?php echo date(‘d-m-Y’, strtotime($row_panggil_rec[“tgl”])); ?>
  2. Misal kita ingin menampilkan format ‘yyyy’ maka cara memanggilnya adalah <?php echo date(‘Y’, strtotime($row_panggil_rec[“tgl”])); ?>
  3. Kalau kita ingin menampilkan format Indonesia, misalnya Minggu, 6 Maret 2011, maka kita menambahkan fungsi LC_TIME, strftime. Penggunaannya seperti ini <?php setlocale(LC_TIME,’in’);
    echo strftime(‘%A, %d %B %Y’, strtotime($row_panggiltgl_rec[‘tgl’])); ?>

Jika point nomor 3 masih bermasalah dalam menampilkan format tanggal indonesia (seperti yang saya alami, maka coba setting ini : setlocale(LC_ALL, 'id_ID.UTF8', 'id_ID.UTF-8', 'id_ID.8859-1', 'id_ID', 'IND.UTF8', 'IND.UTF-8', 'IND.8859-1', 'IND', 'Indonesian.UTF8', 'Indonesian.UTF-8', 'Indonesian.8859-1', 'Indonesian', 'Indonesia', 'id', 'ID', 'en_US.UTF8', 'en_US.UTF-8', 'en_US.8859-1', 'en_US', 'American', 'ENG', 'English');

Sekian dulu, semoga membantu

JOIN multiple table dengan operasi SUM beberapa kolom didalamnya

Tulisan ini mengawali tahun 2011 dimana saya punya permasalahan untuk menampilkan hasil query dari beberapa tabel dimana pada beberapa tabel membutuhkan operasi SUM (penjumlahan). Dari beberapa kali surfing, kita bisa melakukan operasi JOIN pada beberapa tabel. Namun demikian akan muncul permasalahan apabila dari beberapa tabel tersebut dibutuhkan operasi penjumlahan. Hasil yang kita peroleh terhadap penjumlahan tersebut adalah salah, saya tidak bisa menjelaskan secara panjang kesalahan tersebut, namun untuk mengetahui mengapa silahkan dicoba query secara terpisah.

Ok langsung saja dengan contoh saya memiliki 3 buah tabel

1. Tabel data_obat. Tabel ini memuat data kode dan nama obat dengan contoh seperti ini

2. Tabel supplier_obat. Tabel ini memuat pengiriman obat oleh supplier

3. Tabel pakai_obat. Tabel ini digunakan untuk menampung data pemakaian obat

Sekarang kita ingin menampilkan data rekap pemakain seluruh obat dengan kolom : kode, nama_obat, stok, pemakaian
Stok diambil dari jumlah obat berdasar kode dari supplier, sedangkan pemakaian diambil dari jumlah pemakaian obat berdasar jenis obat. Kita akan menggunakan LEFT JOIN untuk menampilkan semua data obat terhadap tabel lain.

Menampilkan data stok

SELECT data_obat.kode, data_obat.nama_obat, SUM(supplier_obat.jumlah) AS stok
FROM data_obat LEFT JOIN supplier_obat
ON data_obat.kode=supplier_obat.kode
GROUP BY data_obat.kode ASC

Menampilkan data pemakaian

SELECT data_obat.kode, data_obat.nama_obat, SUM(pakai_obat.jml_pakai) AS pemakaian
FROM data_obat LEFT JOIN pakai_obat
ON data_obat.kode=pakai_obat.kode
GROUP BY data_obat.kode ASC

Kita akan menggunakan 2 operasi LEFT JOIN
SELECT data_obat.kode, data_obat.nama_obat, SUM(supplier_obat.jumlah) AS stok, SUM(pakai_obat.jml_pakai) AS pemakaian
FROM data_obat
LEFT JOIN supplier_obat ON data_obat.kode=supplier_obat.kode
LEFT JOIN pakai_obat ON pakai_obat.kode=data_obat.kode
GROUP BY data_obat.kode ASC

Ternyata data stok menunjukkan hasil yang salah bila kita bandingkan dengan query secara terpisah. Kenapa demikian? Hal ini disebabkan transaksi penggunaan obat lebih dari 1x maka stok akan dikalikan dengan berapa kali obat tersebut dipakai.

SOLUSI

SELECT data_obat.kode, data_obat.nama_obat, SUM(supplier_obat.jumlah) AS stok, pemakaian
FROM data_obat
LEFT JOIN supplier_obat ON data_obat.kode=supplier_obat.kode
LEFT JOIN
(SELECT data_obat.kode, SUM(pakai_obat.jml_pakai) AS pemakaian
FROM data_obat, pakai_obat
WHERE data_obat.kode=pakai_obat.kode
GROUP BY pakai_obat.kode ASC) AS pakai
ON data_obat.kode=pakai.kode
GROUP BY data_obat.kode ASC

Semoga membantu 🙂

Harap maklum (pemakluman)

Kejadian yang kadang-kadang membuat geli sebagai akibat dari kesalahrancuan pemahaman dan interpretasi sehari-hari (halah ribet amat). Ini adalah kisah nyata yang saya alami

Kisah 1 : Lokasi di toko perlengkapan aquarium
S: saya  PT: penjaga toko

S : “Mbak…mau beli sirkulator”
PT : “Apa itu mas??”
S : “Itu lho mbak, alat buat nyedot air sekaligus ngeluarin lagi supaya air aquarium ga cepet kotor..”
PT : (dengan kalemnya)..”Oooo…itu namanya SIRKULASI mas”
S : (…….tuinxxx…..ngga mau berdebat….X( ……….)

Kisah 2 : Lokasi di toko perlengkapan potret
S: saya  PT: penjaga toko

S : “Mbak, mau beli batere recharge”
PT : “Apaan itu mas”
S : “Itu lho mbak…batere yang bisa disetrum ulang supaya bisa dipake lagi..”
PT : (dengan PDnya)…”Oooo itu CARJER namanya…”
S : (…….tuinxxx…..ngga mau berdebat lagi….X( ……….)