Две неща.
Първо, ако спрете да използвате WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
за да изберете датите си, ще получите три предимства.
- Вашето търсене по дата ще стане с възможност за sargable :индекс ще го ускори.
- Ще получите по-обща схема за избор на месеци.
- Ако имате данни за няколко години във вашите таблици, нещата ще работят по-добре.
Вместо това по принцип използвайте този вид израз за търсене на настоящия месец. Вече разбрахте повечето от това.
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
Това търси всички стойности за дата и час на или след полунощ на първия ден от настоящия месец и преди, но не и на <
, полунощ на първия ден на следващия месец.
Обобщава се за всеки месец, който искате. Например
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
получава миналия месец. Това също работи, когато текущият месец е януари, и работи, когато имате данни за няколко години във вашите таблици.
Тези изрази са малко подробни, защото MySQL няма FIRST_DAY(date)
функция, само a LAST_DAY(date)
функция
. Така че имаме нужда от всички които + INTERVAL 1 DAY
маймунски бизнес
.
Второ, извличането на данни от предходния месец е толкова просто, колкото добавянето на друго LEFT JOIN ( SELECT...
клауза към вашата маса, така. (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
Както можете да видите, периодът от време WHERE
клаузата тук получава редовете от предходния месец.