Dua hal.
Pertama, jika Anda berhenti menggunakan WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
untuk memilih tanggal, Anda akan mendapatkan tiga manfaat.
- Pencarian tanggal Anda akan menjadi sargable :indeks akan mempercepatnya.
- Anda akan mendapatkan skema yang lebih umum untuk memilih bulan.
- Jika Anda memiliki data selama beberapa tahun di tabel Anda, semuanya akan bekerja lebih baik.
Sebagai gantinya, secara umum gunakan ekspresi semacam ini untuk mencari bulan ini. Anda sudah mengetahui sebagian besar dari ini.
WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND wydatki.data_zakupu < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 0 MONTH
Ini mencari semua nilai waktu-tanggal pada atau setelah tengah malam pada hari pertama bulan ini, dan sebelumnya, tetapi tidak pada <
, tengah malam pada hari pertama bulan depan.
Ini menggeneralisasi untuk setiap bulan yang Anda inginkan. Misalnya,
WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
AND wydatki.data_zakupu < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
mendapatkan Anda bulan lalu. Ini juga berfungsi saat bulan berjalan adalah Januari, dan berfungsi saat Anda memiliki data selama beberapa tahun di tabel Anda.
Ekspresi ini sedikit bertele-tele karena MySQL tidak memiliki FIRST_DAY(date)
fungsi, hanya a LAST_DAY(date)
fungsi
. Jadi kita membutuhkan semua itu + INTERVAL 1 DAY
bisnis monyet
.
Kedua, menarik data bulan sebelumnya semudah menambahkan LEFT JOIN ( SELECT...
klausa ke meja Anda, seperti itu. (http://sqlfiddle.com/#!9/676df4/13
)
SELECT ...
coalesce(month1.tot, 0) AS LastMonth
FROM wydatki_kategorie cat
LEFT JOIN
...
LEFT JOIN
(SELECT wydatki_wpisy.kategoria,
sum(wydatki_wpisy.brutto) AS tot
FROM wydatki_wpisy
LEFT JOIN wydatki ON wydatki_wpisy.do_wydatku = wydatki.id_wydatku
WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
AND wydatki.data_zakupu < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND wydatki.id_kupujacy = 1
GROUP BY wydatki_wpisy.kategoria
) month1 ON cat.id_kat = month1.kategoria
Seperti yang Anda lihat, rentang tanggal WHERE
klausa di sini mendapatkan baris bulan sebelumnya.