Memunculkan data berdasarkan tahun dan bulan dengan join

Assalamualaikum,

Maaf temen-temen saya ada kendala, mungkin disini ada yang sudah ahlinya... Nama Tabel : 1. tb_pasien_data_rawat_inap


CREATE TABLE `tb_pasien_data_rawat_inap` (
  `id_pasien` varchar(30) NOT NULL,
  `ke` int(10) NOT NULL DEFAULT '0',
  `id_unik` varchar(50) DEFAULT NULL,
  `diagnosis` varchar(250) DEFAULT NULL,
  `cara_datang` varchar(50) DEFAULT NULL,
  `asuransi` varchar(35) DEFAULT NULL,
  `id_ruangan` int(5) NOT NULL DEFAULT '0',
  `alergi` varchar(1) NOT NULL DEFAULT 'N',
  `jatuh` varchar(1) NOT NULL DEFAULT 'N',
  `hiv` varchar(1) NOT NULL DEFAULT 'N',
  `dnr` varchar(1) NOT NULL DEFAULT 'N',
  `tgl_masuk` datetime DEFAULT NULL,
  `tgl_keluar` datetime DEFAULT NULL,
  `tgl_edit` datetime DEFAULT NULL,
  `masuk_oleh` varchar(50) NOT NULL,
  `keluar_oleh` varchar(50) DEFAULT NULL,
  `edit_oleh` varchar(50) DEFAULT NULL,
  `cara` varchar(1) DEFAULT NULL,
  `dokter` varchar(100) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

2. tb_laporan_kaji_harian


CREATE TABLE `tb_laporan_kaji_harian` (
  `ID` bigint(11) NOT NULL,
  `id_pasien` varchar(65) NOT NULL,
  `ke` int(11) NOT NULL,
  `nyeri` int(11) DEFAULT NULL,
  `jatuh` int(11) DEFAULT NULL,
  `dekubitus` int(11) DEFAULT NULL,
  `nilai_budaya` int(11) DEFAULT NULL,
  `sosial` int(11) DEFAULT NULL,
  `spiritual` int(11) DEFAULT NULL,
  `psikologi` int(11) DEFAULT NULL,
  `disscharge_planning` int(11) DEFAULT NULL,
  `riwayat_alergi` int(11) DEFAULT NULL,
  `edukasi_terintegrasi` int(11) DEFAULT NULL,
  `skrining_gizi` int(11) DEFAULT NULL,
  `kajian_status` int(11) DEFAULT NULL,
  `waktu_pengkajian` datetime DEFAULT NULL,
  `masuk_oleh` varchar(75) DEFAULT NULL,
  `id_ruangan` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Saya ada dua table yang saling berhubungan datanya dan saya ingin menampilkdan datanya berdasarkan tahun,bulan dengan metode pemilihan pada form input tanggal, nah pas saya sudah selesai buat kode nya, yang muncul hanya pada bulan yang datanya terisi saja di bulan februari padahal saya ingin menampilkan datanya keseluruhan walaupun pada bulan janurai bernilai kosong dan maret bernilai kosong...

Berikut kode yang saya buat :


SELECT YEAR(a.tgl_masuk) as tahun, MONTH(a.tgl_masuk) as bulan, SUM(c.nyeri) as nyeri, SUM(c.jatuh) as jatuh , SUM(c.dekubitus) as dekubitus, SUM(c.nilai_budaya) as nilai_budaya, SUM(c.sosial) as sosial, SUM(c.spiritual) as spiritual, SUM(c.psikologi) as psikologi, SUM(c.disscharge_planning) disscharge_planning, SUM(c.riwayat_alergi) as riwayat_alergi, SUM(c.edukasi_terintegrasi) as edukasi_terintegrasi, SUM(c.skrining_gizi) as skrining_gizi, SUM(c.kajian_status) as kajian_status, (SELECT COUNT(id_pasien) FROM tb_pasien_data_rawat_inap as t WHERE DATE(t.tgl_masuk) >= '2018-02-01' and DATE(t.tgl_masuk) <= '2018-03-03' and t.id_ruangan!=100 and t.id_ruangan!=981 and t.id_ruangan!=0) as standar FROM tb_pasien_data_rawat_inap as a INNER JOIN tb_pasien as b ON a.id_pasien = b.id_pasien LEFT JOIN tb_laporan_kaji_harian as c ON a.id_pasien=c.id_pasien WHERE DATE(a.tgl_masuk) >= '2018-1-1' and DATE(a.tgl_masuk) <= '2018-3-31' and c.id_ruangan!=981 and c.id_ruangan!=100 and c.id_ruangan!=0 GROUP BY tahun, bulan ORDER by tahun ASC, bulan ASC, a.id_ruangan ASC, c.masuk_oleh ASC

Dan berikut penampakan hasil dari script kode diatas ketika di jalankan :


Array
(
    [0] => Array
        (
            [tahun] => 2018
            [bulan] => 2
            [id_ruangan] => 929
            [nyeri] => 308
            [jatuh] => 307
            [dekubitus] => 213
            [nilai_budaya] => 298
            [sosial] => 301
            [spiritual] => 300
            [psikologi] => 304
            [disscharge_planning] => 295
            [riwayat_alergi] => 306
            [edukasi_terintegrasi] => 294
            [skrining_gizi] => 213
            [kajian_status] => 227
            [masuk_oleh] => 145993364066568800
        )

)

Hasil yang dinginkan seperti ini :


Array
(
    [0] => Array
        (
            [tahun] => 2018
            [bulan] => 1
            [nyeri] => 0
            [jatuh] => 0
            [dekubitus] => 0
            [nilai_budaya] => 0
            [sosial] => 0
            [spiritual] => 0
            [psikologi] => 0
            [disscharge_planning] => 0
            [riwayat_alergi] => 0
            [edukasi_terintegrasi] => 0
            [skrining_gizi] => 0
            [kajian_status] => 0
        )
[1] => Array
        (
            [tahun] => 2018
            [bulan] => 2
            [nyeri] => 308
            [jatuh] => 307
            [dekubitus] => 213
            [nilai_budaya] => 298
            [sosial] => 301
            [spiritual] => 300
            [psikologi] => 304
            [disscharge_planning] => 295
            [riwayat_alergi] => 306
            [edukasi_terintegrasi] => 294
            [skrining_gizi] => 213
            [kajian_status] => 227
        )
[2] => Array
        (
            [tahun] => 2018
            [bulan] => 3
            [nyeri] => 0
            [jatuh] => 0
            [dekubitus] => 0
            [nilai_budaya] => 0
            [sosial] => 0
            [spiritual] => 0
            [psikologi] => 0
            [disscharge_planning] => 0
            [riwayat_alergi] => 0
            [edukasi_terintegrasi] => 0
            [skrining_gizi] => 0
            [kajian_status] => 0
        )

)

Berikut link tabel database yang saya gunakan jika ada yang ingin membantu, untuk di uji coba...

<a href=' https://drive.google.com/drive/folders/1SCxyyUzuv5V8FQy6FaYb7DRmZipDVVcS?usp=sharing '> https://drive.google.com/drive/folders/1SCxyyUzuv5V8FQy6FaYb7DRmZipDVVcS?usp=sharing </a>

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Diperbarui 6 tahun yang lalu

15 Jawaban:

kalau memang kosong apa yang mau ditampilkan? coba yang where tgl_masuk dibuat between saja & buat kondisi kalau misal data kosongnya..

avatar ameliac
@ameliac

104 Kontribusi 27 Poin

Dipost 6 tahun yang lalu

Soalnya nilai standar jumlah pasien pada setiap bulan itu pasti ada, hanya saja data yang di joinkan pada tabel 2 itu gak mesti ada... Nah saya tetap ingin tampilkan nilai standar pada setiap bulanya walalupun pada tabel yang 2 dalam keadaan kososng...

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

Berarti gak jadi pakai id ruangan mas ? hasil yang di mau bener kaya gitu mas ? Januari sama maret semua nilainya 0 ?

Mungkin gini ya mas

avatar markeronly
@markeronly

378 Kontribusi 230 Poin

Dipost 6 tahun yang lalu

Iya nggak jadi pake id_ruangan mas, iya keluarnya seperti itu mas, tapi data pada tahun 2018 bulan 01 itu seharusnya semuanya nilainya 0, soalnya datanya di tabel tb_laporan_kaji_harian dimulai dari tahun 2018 bulan 02 tanggal 5

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

saran gan, defaultnya ganti ke 0 saja

 CREATE TABLE `tb_laporan_kaji_harian` (
  `ID` bigint(11) NOT NULL,
  `id_pasien` varchar(65) NOT NULL,
  `ke` int(11) NOT NULL,
  `nyeri` int(11) DEFAULT 0,
  `jatuh` int(11) DEFAULT 0,
  `dekubitus` int(11) DEFAULT 0,
  `nilai_budaya` int(11) DEFAULT 0,
  `sosial` int(11) DEFAULT 0,
  `spiritual` int(11) DEFAULT 0,
  `psikologi` int(11) DEFAULT 0,
  `disscharge_planning` int(11) DEFAULT 0,
  `riwayat_alergi` int(11) DEFAULT 0,
  `edukasi_terintegrasi` int(11) DEFAULT 0,
  `skrining_gizi` int(11) DEFAULT 0,
  `kajian_status` int(11) DEFAULT 0,
  `waktu_pengkajian` datetime DEFAULT 0,
  `masuk_oleh` varchar(75) DEFAULT 0,
  `id_ruangan` int(5) DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
avatar dianarifr
@dianarifr

642 Kontribusi 316 Poin

Dipost 6 tahun yang lalu

Baik mas terima kasih atas masukannya... Ini masih belum ketemu untuk sampai kepada hasil yg diinginkan... Mungkin ada master-master yang mau bantu?...

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

coba pake ini gan

 SELECT YEAR(a.tgl_masuk) as tahun,
MONTH(a.tgl_masuk) as bulan,
IFNULL(SUM(c.nyeri),0) as nyeri,
IFNULL(SUM(c.jatuh),0) as jatuh ,
IFNULL(SUM(c.dekubitus),0) as dekubitus,
IFNULL(SUM(c.nilai_budaya),0) as nilai_budaya,
IFNULL(SUM(c.sosial),0) as sosial,
IFNULL(SUM(c.spiritual),0) as spiritual,
IFNULL(SUM(c.psikologi),0) as psikologi,
IFNULL(SUM(c.disscharge_planning) disscharge_planning,
IFNULL(SUM(c.riwayat_alergi),0) as riwayat_alergi,
IFNULL(SUM(c.edukasi_terintegrasi),0) as edukasi_terintegrasi,
IFNULL(SUM(c.skrining_gizi),0) as skrining_gizi,
IFNULL(SUM(c.kajian_status),0) as kajian_status,
FROM tb_pasien_data_rawat_inap as a INNER JOIN tb_pasien as b ON a.id_pasien = b.id_pasien LEFT JOIN tb_laporan_kaji_harian as c ON a.id_pasien=c.id_pasien
WHERE DATE(a.tgl_masuk) >= '2018-1-1' and DATE(a.tgl_masuk) <= '2018-3-31' and c.id_ruangan!=981 and c.id_ruangan!=100 and c.id_ruangan!=0 GROUP BY tahun, bulan ORDER by tahun ASC, bulan ASC, a.id_ruangan ASC, c.masuk_oleh ASC

avatar dianarifr
@dianarifr

642 Kontribusi 316 Poin

Dipost 6 tahun yang lalu

Terimakasih banyak, kepada temen-temen yang sudah ikut bantu jawab... Untuk bang @dianarifr kodenya sudah saya coba hanya saja, masih belum sampai kepada yang diharapkan... Saya banyak-banyak berterimakasih sama temen-temen semua disini atas bantuanya...

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

ada yang kurang, silahkan dicoba

 SELECT YEAR(a.tgl_masuk) as tahun,
MONTH(a.tgl_masuk) as bulan,
IFNULL(SUM(c.nyeri),0) as nyeri,
IFNULL(SUM(c.jatuh),0) as jatuh ,
IFNULL(SUM(c.dekubitus),0) as dekubitus,
IFNULL(SUM(c.nilai_budaya),0) as nilai_budaya,
IFNULL(SUM(c.sosial),0) as sosial,
IFNULL(SUM(c.spiritual),0) as spiritual,
IFNULL(SUM(c.psikologi),0) as psikologi,
IFNULL(SUM(c.disscharge_planning),0) as disscharge_planning,
IFNULL(SUM(c.riwayat_alergi),0) as riwayat_alergi,
IFNULL(SUM(c.edukasi_terintegrasi),0) as edukasi_terintegrasi,
IFNULL(SUM(c.skrining_gizi),0) as skrining_gizi,
IFNULL(SUM(c.kajian_status),0) as kajian_status
FROM tb_pasien_data_rawat_inap as a
INNER JOIN tb_pasien as b ON a.id_pasien = b.id_pasien
LEFT JOIN tb_laporan_kaji_harian as c ON a.id_pasien=c.id_pasien
WHERE DATE(a.tgl_masuk) >= '2018-1-1' and DATE(a.tgl_masuk) <= '2018-3-31'
and c.id_ruangan!=981 and c.id_ruangan!=100 and c.id_ruangan!=0
GROUP BY tahun, bulan
ORDER by tahun ASC, bulan ASC, a.id_ruangan ASC, c.masuk_oleh ASC
avatar dianarifr
@dianarifr

642 Kontribusi 316 Poin

Dipost 6 tahun yang lalu

Dari banyak metode yang temen-temen berikan ke saya, saya bersyukur sekali kepada Allah SWT dikarenakan jadi banyak tau metode-metode cara mengambil data dari database... Saya banyak berterima kasih kepada semuanya yang terlibat dari diskusi ini, semoga kalian selalu mendapatkan segala kebaikan dan diberikan keberkahan atas ilmu pemogramanya... Hasilnya seperti ini gan...

Hasil akhirnya masih belum seperti di bawah ini... Jadi kenapa pada tahun 2018 bulan 01 dan 03 kosong semua, karena data pada tabel tb_kaji_harian datanya baru ada dari tahun 2018 bulan 02... Sehingga bentuknya seperti ini, seharusnya... Array ( [0] => Array ( [tahun] => 2018 [bulan] => 1 [nyeri] => 0 [jatuh] => 0 [dekubitus] => 0 [nilai_budaya] => 0 [sosial] => 0 [spiritual] => 0 [psikologi] => 0 [disscharge_planning] => 0 [riwayat_alergi] => 0 [edukasi_terintegrasi] => 0 [skrining_gizi] => 0 [kajian_status] => 0 ) [1] => Array ( [tahun] => 2018 [bulan] => 2 [nyeri] => 308 [jatuh] => 307 [dekubitus] => 213 [nilai_budaya] => 298 [sosial] => 301 [spiritual] => 300 [psikologi] => 304 [disscharge_planning] => 295 [riwayat_alergi] => 306 [edukasi_terintegrasi] => 294 [skrining_gizi] => 213 [kajian_status] => 227 ) [2] => Array ( [tahun] => 2018 [bulan] => 3 [nyeri] => 0 [jatuh] => 0 [dekubitus] => 0 [nilai_budaya] => 0 [sosial] => 0 [spiritual] => 0 [psikologi] => 0 [disscharge_planning] => 0 [riwayat_alergi] => 0 [edukasi_terintegrasi] => 0 [skrining_gizi] => 0 [kajian_status] => 0 )

)

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

Setiap di join kan dua tabel itu pasti hasilnya di bulan februari tidak sesuai dengan hasil yang di harapkan, di bulan januari juga ada soalnya berdasarkan tanggal masuk si pasien dan ketika di tabel rawat inap dan kolom tgl_masuk ada idpasien dan tgl masuk yang di inginkan di where maka hasilnya akan keluar dan juga terjadi redudansi data yang sangat2 banyak ^^

Sebaiknya tabel2 yang ada di normalisasi lagi mas itu, soalnya ada banyak data yang seharusnya cukup satu dan di sana ada banyak banget yang sama

avatar markeronly
@markeronly

378 Kontribusi 230 Poin

Dipost 6 tahun yang lalu

Betul sekali @markeronly, soalnya ini saya meneruskan design database orang pertama yang membuat... Itu sudah terlanjur banyak sekali datanya...

Terimakasih banyak ya, sudah meluangkan waktunya untuk membantu... Mohon maaf biar pertemananya semakin baik, boleh tau namanya siapa mas @markeronly?...

Alhamdulillah, sudah ketemu caranya, namun memang tidak bisa mengeluarkan data pada bulan maret saja dan tidak bisa diambil dengan satu query tapi di loop..

Berikut kodenya...

$dari       = isset($_POST['dari'])? date('Y-m-d',strtotime($_POST['dari'])) : '2018-01-1';
$sampai     = isset($_POST['sampai'])? date('Y-m-d',strtotime($_POST['sampai'])) : '2018-03-31';

$data_chart_2a = array();

$data_pasien = $Q->DBRecordList('tb_pasien_data_rawat_inap',
        '
        IFNULL(YEAR(tgl_masuk),YEAR(tgl_masuk)) as tahun ,
        IFNULL(MONTH(tgl_masuk),MONTH(tgl_masuk)) as bulan,
        IFNULL(id_pasien,0) as id_pasien,
        IFNULL(ke,0) as ke,
        IFNULL(COUNT(*),0) as standar
        ','
        WHERE
        DATE(tgl_masuk)>= \''.date('Y-m-d',strtotime($dari)).'\' and
        DATE(tgl_masuk)<= \''.date('Y-m-d',strtotime($sampai)).'\' and
        id_ruangan!=981 and
        id_ruangan!=100 and
        id_ruangan!=0
        GROUP BY
        tahun,
        bulan
        ORDER BY
        tahun ASC,
        bulan ASC');

    $NamaKategori3 = array('standar'=>'Jumlah Pasien/Bulan','kajian_status'=>'Pengkajian <8 Jam','nyeri'=>'Nyeri','jatuh'=>'Jatuh','dekubitus'=>'Dekubitus','nilai_budaya'=>'Nilai Budaya','sosial'=>'Sosial','spiritual'=>'Spiritual','psikologi'=>'Psikologi','disscharge_planning'=>'Discharge Planing','riwayat_alergi'=>'Riwayat Alergi','edukasi_terintegrasi'=>'Edukasi Terintegrasi','skrining_gizi'=>'Skrining Gizi');

    foreach ($data_pasien as $key => $value) {
        $tb_kaji = $Q->DBRecordList('tb_laporan_kaji_harian as c',
                                    'IFNULL(YEAR(c.waktu_pengkajian),\''.$value['tahun'].'\') as tahun,
                                    IFNULL(MONTH(c.waktu_pengkajian),\''.$value['bulan'].'\') as bulan,
                                    IFNULL(SUM(c.nyeri),0) as nyeri,
                                    IFNULL(SUM(c.jatuh),0) as jatuh ,
                                    IFNULL(SUM(c.dekubitus),0) as dekubitus,
                                    IFNULL(SUM(c.nilai_budaya),0) as nilai_budaya,
                                    IFNULL(SUM(c.sosial),0) as sosial,
                                    IFNULL(SUM(c.spiritual),0) as spiritual,
                                    IFNULL(SUM(c.psikologi),0) as psikologi,
                                    IFNULL(SUM(c.disscharge_planning),0) disscharge_planning,
                                    IFNULL(SUM(c.riwayat_alergi),0) as riwayat_alergi,
                                    IFNULL(SUM(c.edukasi_terintegrasi),0) as edukasi_terintegrasi,
                                    IFNULL(SUM(c.skrining_gizi),0) as skrining_gizi,
                                    IFNULL(SUM(c.kajian_status),0) as kajian_status
                                    ',
                                    'where
                                    YEAR(c.waktu_pengkajian)=\''.$value['tahun'].'\' and
                                    MONTH(c.waktu_pengkajian)>=\''.$value['bulan'].'\' and
                                    MONTH(c.waktu_pengkajian)<=\''.$value['bulan'].'\'
                                    ORDER BY
                                    YEAR(c.waktu_pengkajian) ASC,
                                    MONTH(c.waktu_pengkajian) ASC');

        $data_chart_2a[] = '{name:"'.$value['tahun'].' - '.$_BULAN[$value['bulan']].'", data:['.$value['standar'].','.$tb_kaji[0]['kajian_status'].','.$tb_kaji[0]['nyeri'].','.$tb_kaji[0]['jatuh'].','.$tb_kaji[0]['dekubitus'].','.$tb_kaji[0]['nilai_budaya'].','.$tb_kaji[0]['sosial'].','.$tb_kaji[0]['spiritual'].','.$tb_kaji[0]['psikologi'].','.$tb_kaji[0]['disscharge_planning'].','.$tb_kaji[0]['riwayat_alergi'].','.$tb_kaji[0]['edukasi_terintegrasi'].','.$tb_kaji[0]['skrining_gizi'].']}';

    }

Hasil Grafiknya seperti ini :

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

itu ga berat querynya? wkwk

avatar dianarifr
@dianarifr

642 Kontribusi 316 Poin

Dipost 6 tahun yang lalu

@irfanmyj oh pantesan mas udah terlanjur basah ya haha nama saya Agung mas ^^ salam kenal mas irfan. @dianarifr pasti berat banget mas wkwk mungkin cara untuk saat ini kaya gitu kali mas, nanti kan kedepan bisa di refactor lagi ituu *eh jadi kerja 2 x haha

avatar markeronly
@markeronly

378 Kontribusi 230 Poin

Dipost 6 tahun yang lalu

Kalau datanya sudah banyak banget pasti berat, tapi terimakasih banyak atas bantuanya temen-temen semua disini... @dianarifr dan @markeronly atau Mas Agung...

avatar irfanmyj
@irfanmyj

32 Kontribusi 0 Poin

Dipost 6 tahun yang lalu

Login untuk ikut Jawaban