数据库
首页 > 数据库> > mysql – 运行总计超过日期范围 – 填写缺少的日期

mysql – 运行总计超过日期范围 – 填写缺少的日期

作者:互联网

我有下表.

DATE  | AMT
10/10 | 300
12/10 | 300
01/11 | 200
03/11 | 100

我如何获得每月总数?结果像 –

DATE | TOT
1010 | 300
1110 | 300
1210 | 600 
0111 | 800
0211 | 800
0311 | 900

一个sql语句就好

SELECT SUM(AMT) FROM TABLE1 WHERE DATE BETWEEN '1010' AND '0111'

会导致800为0111,但……

注意没有日期限制.这是我的困境.如何在不对所有日期执行循环的情况下填充此列并显示缺少的月份?

解决方法:

为了迎合缺失的月份,请创建要加入的模板表.

把它想象成缓存.只需在数据库中缓存日历,而不是循环并填补空白.

您甚至可以将多个日历(月初,周开始,银行假日,工作日等)组合到一个表中,其中包含一堆搜索标记和索引.

你最终得到像…

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= calendar.date
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= '20110101'
  AND calendar.date <  '20120101'
GROUP BY
  calendar.date

编辑

我只是注意到OP需要一个总计.

这在SQL中是可能的,但效率极低.原因是一个月的结果不用于计算下个月.相反,必须再次计算整个运行总计.

因此,通常强烈建议您按上述方法计算月度总计,然后使用您的应用程序进行迭代并计算运行总值.

如果你真的必须在SQL中做,那就像……

SELECT
  calendar.date,
  SUM(data.amt)
FROM
  calendar
LEFT JOIN
  data
    ON  data.date >= @yourFirstDate
    AND data.date <  calendar.date + INTERVAL 1 MONTH
WHERE
      calendar.date >= @yourFirstDate
  AND calendar.date <  @yourLastDate
GROUP BY
  calendar.date

标签:gaps-and-islands,sql,mysql
来源: https://codeday.me/bug/20191009/1876668.html