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

1.问题复现:

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

a7505b21cd5ed9b918dcf1ca5bf64cb0.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)

FROM

order) t0

LIMIT 7

执行结果如下:

36c228bb9c37fa6c386a8da9b599084d.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条的即可,执行结果如下:

fa0b57e016a6f6b1373c45910f58096f.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

最终执行结果:

78ee7c0815bd1bd8b67b6666cb414de2.png

总结

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

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值