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

5 thoughts on “Menampilkan semua tanggal pada hasil query mysql

  1. nah ini yg saya cari… sayangnya saat sy coba kenapa tanggal 2012-03-27 berisi NULL, kira kira salah dimana ya? mohon balasan. trims

    • Bisa saya melihat potongan script php yang mengeksekusi tanggal? Atau dipastikan dulu tipe data di mysql adalah date atau datetime. Terima kasih

      • Tipe data yang saya pakai untuk tgl kunjungan adalah datetime, apabila tipe daya anda adalah date maka perintah sql yang ada awalan date() dihilangkan, langsung memanggil nama kolomnya. Fungsi penambahan date() adalah untuk memanggil komponen tanggal(date) saja dari komponen datetime. Semoga membantu.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s