我有下表.
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。