Duas coisas.
Primeiro, se você parar de usar
WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
para escolher suas datas você terá três benefícios. - Sua pesquisa de data se tornará sargable :um índice irá acelerá-lo.
- Você terá um esquema mais geral para escolher os meses.
- Se você tiver dados de vários anos em suas tabelas, as coisas funcionarão melhor.
Em vez disso, em geral, use esse tipo de expressão para pesquisar o mês atual. Você já descobriu a maior parte disso.
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
Isso procura todos os valores de data e hora após a meia-noite do primeiro dia do mês atual e antes, mas não em
<
, meia-noite do primeiro dia do mês seguinte. Ele generaliza para qualquer mês que você quiser. Por exemplo,
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
recebe você no mês passado. Isso também funciona quando o mês atual é janeiro e funciona quando você tem dados de vários anos em suas tabelas.
Essas expressões são um pouco detalhadas porque o MySQL não tem um
FIRST_DAY(date)
função, apenas um LAST_DAY(date)
função
. Portanto, precisamos de todos os que + INTERVAL 1 DAY
negócio de macaco
. Segundo, extrair os dados de um mês anterior é tão simples quanto adicionar outro
LEFT JOIN ( SELECT...
cláusula para sua mesa, assim. (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
Como você pode ver, o intervalo de datas
WHERE
cláusula aqui obtém as linhas do mês anterior.