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

最終執行結果:

完畢!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM