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