mysql数据库表中没有0_mysql按照天统计报表当天没有数据填0的实现代码

在MySQL中,当按照天数统计数据时,若某天无记录,统计结果会忽略该天。通过使用连续天数表进行LEFT JOIN操作,可以解决这个问题。创建一个从指定日期往前推7天的连续天数表,然后与业务数据表进行LEFT JOIN,并根据天数表进行GROUP BY,即使业务数据中没有对应日期,也能确保所有日期都出现在结果中,并以0填充缺失的统计值。
摘要由CSDN通过智能技术生成

1.问题复现:

按照天数统计每天的总数,如果其中有几天没有数据,那么group by 返回会忽略那几天,如何填充0?如下图,统计的10-3~10-10 7天的数据,其中只有8号和10号有数据,这样返回,数据只有2个,不符合报表统计的需求。期望没有值填0

2018012611373911.png

2.换个思维:

我们用一组连续的天数作为左表然后left join 要查询的数据 最后group by.:连续天数表 t1 left join 业务数据  t2 group by t1.day ,如下图:

SELECT

t1.`day`,

COUNT(t2.user_id) payment_num

FROM

(SELECT

@cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) DAY

FROM

(SELECT

@cdate := DATE_ADD('20171219', INTERVAL + 1 DAY)

FROM

order) t0

LIMIT 7) t1

LEFT JOIN

(SELECT

DATE(a.create_time) DAY,

a.user_id

FROM

pay_payment a

JOIN dealer_store b

ON a.order_no = b.order_no

WHERE DATE(create_time) <= '20171219'

AND DATE(create_time) > DATE_SUB('20171219', INTERVAL 7 DAY)

) t2

ON t2.day = t1.day

GROUP BY t1.`day`;

2.1 连续天数表

SELECT

@cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) DAY

FROM

(SELECT

@cdate := DATE_ADD('20171219', INTERVAL + 1 DAY)

FROM

order) t0

LIMIT 7

执行结果如下:

2018012611374012.png

SQL分析:

1. @cdate :=  是定义名为cdate的变量并赋值(select 后面必须用:=)

2.@cdate := DATE_ADD('20171219', INTERVAL + 1 DAY)按照传入的日期'20171219',加一天

3.SELECT @cdate := DATE_ADD('20171219', INTERVAL + 1 DAY) FROM `order`找一张表记录肯定大于10条的即可,执行结果如下:

2018012611374013.png

4.@cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) DAY 把定义的cdate变量天数-1(自减)

5.LIMIT 7 限制一下条数,大功告成,我们得到了指定日期往前7天的记录

2.2 左关联然后分组

left join group by t1.day

即按照左表关联业务数据,根据左表的日期分组,即分成了指定的7天数据,有记录就统计条数,没有记录就是0

最终执行结果:

2018012611374014.jpg

总结

以上所述是小编给大家介绍的mysql按照天统计报表当天没有数据填0的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

本文标题: mysql按照天统计报表当天没有数据填0的实现代码

本文地址: http://www.cppcns.com/shujuku/mysql/218762.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值