我正在尝试为我的查询引入一个新列,它当前计算本月的费用总和,新列应显示上个月的费用。我不太确定把它放在哪里。
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)
最佳答案
两件事。
首先,如果您停止使用 WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
选择您的日期,您将获得三项好处。
- 您搜索的日期将变为 sargable : 索引会加快速度。
- 您将获得一个更通用的月份选择方案。
- 如果您的表中有多年的数据值(value),事情会更好。
相反,通常使用这种表达式来搜索当前月份。您已经了解其中的大部分内容。
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
此处的子句获取上个月的行。
关于mysql - 为上个月的总和引入一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45732621/