mysql按照天統計報表,當天沒有數據,填0

1.問題復現:

按照天數統計天天的總數,若是其中有幾天沒有數據,那麼group by 返回會忽略那幾天,如何填充0?以下圖,統計的10-3~10-10 7天的數據,其中只有8號和10號有數據,這樣返回,數據只有2個,不符合報表統計的需求。指望沒有值填0spa

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

 

執行結果以下:3d

 

SQL分析:code

1.@cdate :是定義名爲cdate的變量並賦值(select 後面必須用:=)blog

2.@cdate := DATE_ADD('20171219', INTERVAL + 1 DAY) 按照傳入的日期'20171219',加一天class

3.SELECT @cdate := DATE_ADD('20171219', INTERVAL + 1 DAY) FROM `order`  找一張表記錄確定大於10條的便可,執行結果以下:變量

4.@cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) DAY  把定義的cdate變量天數-1(自減) date

5.LIMIT 7 限制一下條數,大功告成,咱們獲得了指定日期往前7天的記錄select

2.2 左關聯而後分組

 

left join group by t1.day

 

即按照左表關聯業務數據,根據左表的日期分組,即分紅了指定的7天數據,有記錄就統計條數,沒有記錄就是0im

最終執行結果:統計

完畢!

相關文章
相關標籤/搜索