mysql - 为上个月的总和引入一个新列

标签 mysql sql datetime group-by

我正在尝试为我的查询引入一个新列,它当前计算本月的费用总和,新列应显示上个月的费用。我不太确定把它放在哪里。

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)

SQL Fiddle example

最佳答案

两件事。

首先,如果您停止使用 WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())选择您的日期,您将获得三项好处。

  1. 您搜索的日期将变为 sargable : 索引会加快速度。
  2. 您将获得一个更通用的月份选择方案。
  3. 如果您的表中有多年的数据值(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/

相关文章:

php - SQL 赞成票反对系统

mysql - 如何优化和快速运行SQL查询

mysql - 从链接列可以为空的两个表中选择

python - 日期时间中丢失的微秒

mysql - 为什么 default_week_format 变量适用于 WEEK 但不适用于 YEARWEEK

php - mysql 表未使用 php mysqli 从表单接收数据

sql - go-GORM无法插入值

sql - SQL中的格式化

mysql - SQL查询必须返回所有数据,而不仅仅是现有数据

bash - 我们如何根据 unix 中的给定日期获取工作日