Två saker.
Först, om du slutar använda WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
för att välja dina datum får du tre förmåner.
- Din datumsökning blir sargable :ett index kommer att påskynda det.
- Du får ett mer allmänt schema för att välja månader.
- Om du har flera års data i dina tabeller kommer det att fungera bättre.
Använd istället i allmänhet den här typen av uttryck för att söka efter den aktuella månaden. Du har redan räknat ut det mesta.
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
Detta letar efter alla datetime-värden på eller efter midnatt den första dagen i den aktuella månaden och före, men inte på <
, midnatt den första dagen i nästa månad.
Det generaliserar till vilken månad du vill. Till exempel,
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
får dig förra månaden. Detta fungerar även när den aktuella månaden är januari, och det fungerar när du har flera års data i dina tabeller.
Dessa uttryck är lite utförliga eftersom MySQL inte har en FIRST_DAY(date)
funktion, endast a LAST_DAY(date)
funktion
. Så vi behöver alla som + INTERVAL 1 DAY
monkey business
.
För det andra, att ta ut tidigare månads data är lika enkelt som att lägga till ytterligare en LEFT JOIN ( SELECT...
klausul till ditt bord, som så. (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
Som du kan se är datumintervallet WHERE
klausul här får föregående månads rader.