zoukankan      html  css  js  c++  java
  • mysql按照天统计报表,当天没有数据,填0

    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('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

    执行结果如下:

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

    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

    最终执行结果:

    完毕!

  • 相关阅读:
    05Linux系统常用命令
    04Linux系统目录结构
    02Linux文件系统基本结构
    01Linux_BASH基本操作
    [HTML] HTML常用标签及HTML语义化理解
    [Tools] MDN简介及如何使用MDN查找资料
    [HTTP] 初识HTTP
    [Git] Git 入门(常用命令使用)
    [CL](入门)命令行常用命令使用技巧
    IFE_part2_JavaScript_Ajax学习
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/8073181.html
Copyright © 2011-2022 走看看