Due cose.
Innanzitutto, se smetti di usare WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
per scegliere le date avrai tre vantaggi.
- La tua ricerca sulla data diventerà sargable :un indice lo velocizzerà.
- Otterrai uno schema più generale per la scelta dei mesi.
- Se nelle tue tabelle hai più anni di dati, le cose funzioneranno meglio.
Invece, in generale, usa questo tipo di espressione per cercare il mese in corso. Hai già capito la maggior parte di questo.
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
Cerca tutti i valori datetime alla mezzanotte o dopo la mezzanotte del primo giorno del mese in corso e prima, ma non in <
, mezzanotte del primo giorno del mese successivo.
Si generalizza a qualsiasi mese tu voglia. Ad esempio,
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
ti prende il mese scorso. Funziona anche quando il mese corrente è gennaio e funziona quando nelle tabelle sono presenti dati per più anni.
Queste espressioni sono un po' dettagliate perché MySQL non ha un FIRST_DAY(date)
funzione, solo a LAST_DAY(date)
funzione
. Quindi abbiamo bisogno di tutte le che + INTERVAL 1 DAY
affari delle scimmie
.
In secondo luogo, estrarre i dati di un mese precedente è semplice come aggiungere un altro LEFT JOIN ( SELECT...
clausola al tuo tavolo, in questo modo. (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
Come puoi vedere, l'intervallo di date WHERE
la clausola qui ottiene le righe del mese precedente.