mysql按照天统计报表,当天没有数据,填0
2024-09-22 09:39:43
1.问题复现:
按照天数统计每天的总数,如果其中有几天没有数据,那么group by 返回会忽略那几天,如何填充0?如下图,统计的10-3~10-10 7天的数据,其中只有8号和10号有数据,这样返回,数据只有2个,不符合报表统计的需求。期望没有值填0
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('', 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) <= ''
AND DATE(create_time) > DATE_SUB('', 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('', INTERVAL + 1 DAY)
FROM
order) t0
LIMIT 7
执行结果如下:
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条的即可,执行结果如下:
.@cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) DAY 把定义的cdate变量天数-1(自减)
5.LIMIT 7 限制一下条数,大功告成,我们得到了指定日期往前7天的记录
2.2 左关联然后分组
left join group by t1.day
即按照左表关联业务数据,根据左表的日期分组,即分成了指定的7天数据,有记录就统计条数,没有记录就是0
最终执行结果:
完毕!
最新文章
- 【MVVM DEV】DataColumn中的TextBox与ComboBox的并存
- javascript函数setInterval和setTimeout的使用区别详解
- “全能”选手—Django 1.10文档中文版Part3
- Linux_vi编辑器
- zabbix使用sendEmail发送邮件报警
- ubuntu修改源列表sourcelist的方法
- PL/pgSQL RETURNS TABLE 例子
- static与线程安全 -摘自网络
- AsyncTask api
- 简述TVS是的命名和封装
- #include <;array>;
- JSON 解析工具的封装(Java)
- springcloud干活之服务消费者(feign)
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]
- java.sql.SQLException: ORA-01841
- Gadgets for dollars and pounds CodeForces - 609D
- 【LaTeX排版】LaTeX论文排版<;四>;
- Pycharm使用教程(四)-安装python依赖包(非常详细,非常实用)
- 启动aspx文件错误
- git无法pull仓库refusing to merge unrelated histories (拒绝合并不相关仓库)