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

最终执行结果:

完毕!

最新文章

  1. 【MVVM DEV】DataColumn中的TextBox与ComboBox的并存
  2. javascript函数setInterval和setTimeout的使用区别详解
  3. “全能”选手—Django 1.10文档中文版Part3
  4. Linux_vi编辑器
  5. zabbix使用sendEmail发送邮件报警
  6. ubuntu修改源列表sourcelist的方法
  7. PL/pgSQL RETURNS TABLE 例子
  8. static与线程安全 -摘自网络
  9. AsyncTask api
  10. 简述TVS是的命名和封装
  11. #include &lt;array&gt;
  12. JSON 解析工具的封装(Java)
  13. springcloud干活之服务消费者(feign)
  14. BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]
  15. java.sql.SQLException: ORA-01841
  16. Gadgets for dollars and pounds CodeForces - 609D
  17. 【LaTeX排版】LaTeX论文排版&lt;四&gt;
  18. Pycharm使用教程(四)-安装python依赖包(非常详细,非常实用)
  19. 启动aspx文件错误
  20. git无法pull仓库refusing to merge unrelated histories (拒绝合并不相关仓库)

热门文章

  1. window下nginx的常用命令
  2. df 命令详解
  3. JS中数组的方法
  4. JVM虚拟机(一) 内存区域
  5. 【转】java jvm 线程 与操作系统线程
  6. Vue 爬坑之路(五)—— 组件进阶
  7. vue实现星级评价效果
  8. 安卓电量优化之WakeLock锁机制全面解析
  9. 第十一章:Python の 网络编程基础(三)
  10. Factom(公证通)--基于区块链的存证系统