SQL查询当前月每天的数据量,没有补0
需求: 查询当前月每天的数据量,此处表的名称为:ticket_ticket
直接上sql:
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket
AND YEAR(create_at)=YEAR(CURDATE())
AND MONTH(create_at)=MONTH(CURDATE())
GROUP BY DATE(create_at)
查询结果如下:
可以看出时间不连贯,没有2021-01-03的数据。如果没有特殊要求这样的数据没有问题,但我这边是用来画折线图的,所以必须是连贯性的数据。
解决方法如下:
步骤一:生成一个日期表
sql如下:
SELECT
@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY )
FROM ticket_ticket
)d1
WHERE YEAR(@cdate)=YEAR(CURDATE())
AND MONTH(@cdate)=MONTH(CURDATE())
AND DAY(@cdate) > 1
ORDER BY date
结果如下:
步骤二:将查询结果表并入日期表
sql如下:
SELECT * FROM (
SELECT
@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY )
FROM ticket_ticket
)d1
WHERE YEAR(@cdate)=YEAR(CURDATE())
AND MONTH(@cdate)=MONTH(CURDATE())
AND DAY(@cdate) > 1
ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket WHERE flow_id=336 AND YEAR(create_at)=YEAR(CURDATE()) AND MONTH(create_at)=MONTH(CURDATE()) GROUP BY DATE(create_at)
)tab ON DATE(t)=date
结果如下:
步骤三:处理查询结果:NULL设置为0,并按照日期排序
sql如下:
SELECT date as 日期, IFNULL(tab.num, 0) as 数量 FROM (
SELECT
@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY )
FROM ticket_ticket
)d1
WHERE YEAR(@cdate)=YEAR(CURDATE())
AND MONTH(@cdate)=MONTH(CURDATE())
AND DAY(@cdate) > 1
ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket WHERE flow_id=336 AND YEAR(create_at)=YEAR(CURDATE()) AND MONTH(create_at)=MONTH(CURDATE()) GROUP BY DATE(create_at)
)tab ON DATE(t)=date
ORDER BY date;
结果如下:
总结这里用到的sql
- ORDER BY
定义:用于对结果集按照一个列或者多个列进行排序。默认按照升序,如果需要按照降序对记录进行排序,您可以使用 DESC 关键字
用法:
SELECT column_name
FROM table_name
ORDER BY column_name ASC|DESC;
-
DATE_ADD(date,INTERVAL expr type)
定义:向指定日期添加指定的时间间隔
用法:date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔,可以为正数+3,也可以为负数-3。type是间隔的类型,可以是天DAY,也可以是MONTH,也可以是其他的。 -
DATE(date)
定义: 提取日期或日期/时间表达式的日期部分
用法:date参数可以为日期‘2020-02-19’,也可以为时间‘2020-02-19 12:20:12’,最终结果都为‘2020-02-19’ -
LEFT JOIN
定义:从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
用法:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
其中ON为合并条件,如果想直接合并,可以使用ON 1
- IFNULL(expr1,expr2)
定义:如果expr1字段为NULL,则返回值expr2
标签:
SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!