ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-10-09 04:17:28  阅读:140  来源: 互联网

标签:gaps-and-islands sql 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

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

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有