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

博客讲述了在SQL中如何处理数据缺失的问题,通过使用LEFT JOIN和GROUP BY结合连续日期表来确保所有日期都有记录,即使原数据中存在空白。方法包括使用变量和自减日期间隔生成连续日期序列,并通过LEFT JOIN确保无数据的日子显示为0。这是一种解决报表统计中要求完整日期范围数据的方法。

1.问题复现:

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

137072_0.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

执行结果如下:

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

137072_2.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

最终执行结果:

137072_3.jpg

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值