Zwei Dinge.
Erstens, wenn Sie aufhören, WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
zu verwenden Um Ihre Daten auszuwählen, erhalten Sie drei Vorteile.
- Ihre Datumssuche wird sargable :ein Index wird es beschleunigen.
- Sie erhalten ein allgemeineres Schema zur Auswahl der Monate.
- Wenn Sie Daten aus mehreren Jahren in Ihren Tabellen haben, wird es besser funktionieren.
Verwenden Sie stattdessen im Allgemeinen diese Art von Ausdruck, um nach dem aktuellen Monat zu suchen. Sie haben das meiste davon bereits herausgefunden.
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
Dies sucht nach allen datetime-Werten am oder nach Mitternacht am ersten Tag des aktuellen Monats und davor, aber nicht am <
, Mitternacht am ersten Tag des nächsten Monats.
Es verallgemeinert sich auf jeden gewünschten Monat. Beispiel:
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
bekommt Sie letzten Monat. Dies funktioniert auch, wenn der aktuelle Monat Januar ist, und es funktioniert, wenn Sie Daten aus mehreren Jahren in Ihren Tabellen haben.
Diese Ausdrücke sind etwas ausführlich, weil MySQL keinen FIRST_DAY(date)
hat Funktion, nur a LAST_DAY(date)
Funktion
. Also brauchen wir alles das + INTERVAL 1 DAY
Affengeschäft
.
Zweitens ist das Herausziehen der Daten eines vorherigen Monats so einfach wie das Hinzufügen eines weiteren LEFT JOIN ( SELECT...
Klausel zu Ihrem Tisch, so. (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
Wie Sie sehen können, ist der Datumsbereich WHERE
-Klausel hier ruft die Zeilen des Vormonats ab.