Hai điều.
Đầu tiên, nếu bạn ngừng sử dụng WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
để chọn ngày của bạn, bạn sẽ nhận được ba lợi ích.
- Ngày tìm kiếm của bạn sẽ trở thành sargable :một chỉ mục sẽ tăng tốc.
- Bạn sẽ nhận được sơ đồ tổng quát hơn để chọn tháng.
- Nếu bạn có nhiều năm dữ liệu trong bảng của mình, mọi thứ sẽ hoạt động tốt hơn.
Thay vào đó, nói chung sử dụng loại biểu thức này để tìm kiếm tháng hiện tại. Bạn đã tìm ra hầu hết điều này.
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
Điều này tìm kiếm tất cả các giá trị ngày giờ vào hoặc sau nửa đêm của ngày đầu tiên của tháng hiện tại và trước đó, nhưng không tìm kiếm trên <
, nửa đêm của ngày đầu tiên của tháng sau.
Nó tổng quát cho bất kỳ tháng nào bạn muốn. Ví dụ,
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
có được bạn vào tháng trước. Điều này cũng hoạt động khi tháng hiện tại là tháng 1 và nó hoạt động khi bạn có giá trị dữ liệu nhiều năm trong bảng của mình.
Các biểu thức này hơi dài dòng vì MySQL không có FIRST_DAY(date)
chức năng, chỉ a LAST_DAY(date)
chức năng
. Vì vậy, chúng tôi cần tất cả điều đó + INTERVAL 1 DAY
kinh doanh khỉ
.
Thứ hai, việc lấy ra dữ liệu của tháng trước cũng đơn giản như thêm một LEFT JOIN ( SELECT...
cho bảng của bạn, như vậy. ( 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
Như bạn có thể thấy, phạm vi ngày WHERE
mệnh đề ở đây lấy các hàng của tháng trước.