我正在尝试为我的查询引入一个新列,它目前计算本月的费用总和,新列应显示上个月的费用。我不太确定在哪里放置它。
SELECT cat.id_kat,
cat.nazwa,
coalesce(exp.tot, 0) AS PriceTotal
FROM wydatki_kategorie cat
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 MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
AND wydatki.id_kupujacy = 1
GROUP BY wydatki_wpisy.kategoria) exp ON cat.id_kat = exp.kategoria
可能需要(如果我没错) - 上个月的Where子句。
wydatki.data_zakupu >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND
wydatki.data_zakupu<= DATE_SUB(NOW(), INTERVAL 1 MONTH)
答案 0 :(得分:1)
两件事。
首先,如果您停止使用WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
选择日期,您将获得三项好处。
相反,通常使用这种表达式来搜索当前月份。你已经弄清楚了大部分内容。
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
上个月送你。这在当前月份是1月时也有效,并且当您在表格中有多年的数据时它会起作用。
这些表达式有点冗长,因为MySQL没有FIRST_DAY(date)
函数,只有a LAST_DAY(date)
function。所以我们需要所有that + INTERVAL 1 DAY
monkey business。
其次,取出上个月的数据就像在表中添加另一个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
子句获取上个月的行。