一行SQL语句实现统计未来7天、按月统计数据,无数据填充0

news/2024/10/4 20:20:20

1 背景

由于业务需求,在项目的报表中心中需要未来7天、按月统计数据,且要求按天补全数据,补数据填为0。
  附实测SQL语句,请大家指正。

2 举例

2.1未来7天,按天补全数据,无数据填充0

sql语句:

select t1.lastDays as x, IFNULL(t2.count,0) as val
from (SELECT date_format( @lastDay := date_add( @lastDay, INTERVAL 1 DAY ), '%Y-%m-%d' ) lastDays FROM ( SELECT @lastDay := date_add( curdate( ), INTERVAL - 1 DAY ) FROM mysql.help_topic LIMIT 7 ) a)as t1
left join (select DATE_FORMAT(maintenance_time, '%Y-%m-%d') as time_1, SUM(b.employee_number) as count from maintenance_plan a LEFT JOIN maintenance_strategy b ON (b.model_id = a.model_id) where a.maintenance_type=1 group by maintenance_time)t2 on t2.time_1=t1.lastDays

查询结果:

 
2.2 当月1-月底,按天补全数据,无数据填充0
sql语句:
select t1.lastDays as x, IFNULL(t2.count,0) as val
from (SELECT date_format(date_add(@firstDayOfMonth := DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01'), INTERVAL a.help_topic_id DAY), '%Y-%m-%d') AS lastDays  FROM mysql.help_topic a WHERE a.help_topic_id BETWEEN 0 AND DATEDIFF(@lastDayOfMonth := LAST_DAY(CURDATE()), @firstDayOfMonth := DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01')))as t1
left join (select DATE_FORMAT(maintenance_time, '%Y-%m-%d') as time_1, COUNT(x.id) as count from maintenance_plan x group by DATE_FORMAT(x.maintenance_time, '%Y-%m-%d'))t2 on t2.time_1=t1.lastDays	

查询结果:还有2024-05-01和2024-05-02

 

3 SQL语句原理和拆解说明

原理:使用MySql的系统表help_topic,使用表中自增ID(help_topic_id),用于进行行表关联操作和计数。
  使用sql语句查询,发现help_topic累计有701条数据(包括help_topic_id=0),MySql版本为:8.0.27

3.1 拆解思路

3.1.1 第一步:通过help_topic取连续的数值段

查询未来7天SQL语句,如下:

SELECT date_format( @lastDay := date_add( @lastDay, INTERVAL 1 DAY ), '%Y-%m-%d' ) lastDays
FROM ( SELECT @lastDay := date_add( curdate( ), INTERVAL - 1 DAY ) FROM mysql.help_topic LIMIT 7 ) a

date_add( @lastDay, INTERVAL 1 DAY ) 表示每次增加1天,

date_add( curdate( ), INTERVAL - 1 DAY ) 表示包括当天

LIMIT 7 表示取7条记录

执行结果:

 

 查询当月每天SQL语句,如下:

SELECT date_format(date_add(@firstDayOfMonth := DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01'), INTERVAL a.help_topic_id DAY), '%Y-%m-%d') AS lastDays 
FROM mysql.help_topic a 
WHERE a.help_topic_id BETWEEN 0 AND DATEDIFF(@lastDayOfMonth := LAST_DAY(CURDATE()), @firstDayOfMonth := DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01'))
DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01') 表示取当月的1号
LAST_DAY(CURDATE()) 表示当前日期的当月最后一天

执行结果:

 

3.1.2 第二步:使用left join左连接业务表

        有了第一步的日期字段,结合业务表时,需要使用left join进行左连接。

        使用on,将业务表中日期字段格式化为%Y-%m-%d,与日期字段(lastDays)格式保持一致,并将统计的结果值命名为指定的字段名(count),用于使用别名t2.count取值。如下所示

select t1.lastDays as x, IFNULL(t2.count,0) as val
from (SELECT date_format(date_add(@firstDayOfMonth := DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01'), INTERVAL a.help_topic_id DAY), '%Y-%m-%d') AS lastDays  FROM mysql.help_topic a WHERE a.help_topic_id BETWEEN 0 AND DATEDIFF(@lastDayOfMonth := LAST_DAY(CURDATE()), @firstDayOfMonth := DATE_FORMAT(CURDATE() - INTERVAL (DAY(CURDATE()) - 1) DAY, '%Y-%m-01')))as t1
left join (select DATE_FORMAT(maintenance_time, '%Y-%m-%d') as time_1, COUNT(x.id) as count from maintenance_plan x group by DATE_FORMAT(x.maintenance_time, '%Y-%m-%d'))t2 on t2.time_1=t1.lastDays	

 

3.1.3 第三步:查询数据时,使用IFNULL校验数据值,当为NULL时,赋值为0

        如果业务表中无该日期的数据,left join业务表中该日期的记录为null,故可以在查询结果中使用IFNULL校验t2.count,实现为null,则赋值为0

 

4 拓展

统计未来7个月,将DAY换成MONTH,例子如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28870.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【译】使用(滥用)LLM 压缩文本

来源:o565.com/llm-text-compression/介绍 大型语言模型是在大型文本数据集上进行训练的,以学习更大文档中单词的关系和上下文。这些关系是模型生成文本的基础。 最近,我读到了关于 LLMs 被训练在受版权保护的文本上并将其复制的担忧。这让我想:可以从 LLM 中提取训练文本吗…

NodeJS路径遍历:示例及预防

让我们来看看什么是路径遍历攻击,以及在Node.js中可以采用哪些方法来阻止这种攻击。构建一个安全而健壮的应用程序需要考虑的因素很多,并非一件容易的事情。要确保覆盖所有潜在的漏洞是一项十分艰巨的任务,这需要大量的经验和指导。在这些漏洞中,有一个和系统目录访问安全相…

k8s搭建集群

1.单master集群 模式缺点:如果master宕机了,就整个集群也没有办法访问了。2.多master集群 模式 3.快速搭建k8s集群--Kubeadm: 4.快速搭建k8s集群--二进制方式:

在Windows运行Gitlab Runner打包基于.NET Framework 4.6.1的项目

摘要 本文详细描述了运行在Windows商的Gitlab Runner,如何自动集成.NET Framework的项目。 Gitlab中的变量 变量1:NUPKG_OUTPUT_ROOT 这个目录是在git获取的解决方案根目录之外,因为stages变了以后,当前Gitlab Runner工作的当前解决方案根目录下会被清空。我们希望build了以…

何小鹏:活过淘汰赛,要做多边形战士下的规模第一

在北京车展上,小鹏汽车董事长 CEO 何小鹏接受媒体采访,就价格战、未来趋势、小米汽车等行业热点话题回答了媒体的提问。作为造车新势力的重要厂商,小鹏接下来也面临着市场淘汰赛的考验。 一方面是越来越激烈的价格战,另一方面还有小米、华为这样的科技大厂的强势入局,何小…

《最新出炉》系列入门篇-Python+Playwright自动化测试-44-鼠标操作-上篇

1.简介 前边文章中已经讲解过鼠标的拖拽操作,今天宏哥在这里对其的其他操作进行一个详细地介绍和讲解,然后对其中的一些比较常见的、重要的操作单独拿出来进行详细的介绍和讲解。 2.鼠标操作语法 鼠标操作介绍官方API的文档地址:https://playwright.dev/docs/api/class-mous…

windows下使用命令行查看已存储的wifi密码

netsh wlan show interface查看当前已连接wifi信息 netsh wlan show profiles查看所有已保存的wifi配置文件 netsh wlan show profiles name="XXXXXX" key="Clear"查看特定配置文件详情,包括wifi密码,密码在“关键内容”行