2つのこと。
まず、 WHERE MONTH(wydatki.data_zakupu)=MONTH(CURRENT_DATE())
の使用を停止した場合 日付を選択すると、3つのメリットがあります。
- 日付検索は
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
これは、当月の初日の午前0時以降、およびそれ以前のすべての日時値を検索しますが、<
は検索しません。 、翌月初日の深夜。
それはあなたが望むどんな月にも一般化します。たとえば、
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
先月あなたを取得します。これは、現在の月が1月の場合にも機能し、テーブルに複数年分のデータがある場合にも機能します。
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
ここの句は前月の行を取得します。