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
最終執行結果:

總結
以上所述是小編給大家介紹的mysql按照天統計報表當天沒有數據填0的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
您可能感興趣的文章:- MySQL 統計查詢實現代碼
- MYSQL中有關SUM字段按條件統計使用IF函數(case)問題
- 如何使用MySQL查詢某個列中相同值的數量統計
- 利用MySQL統計一列中不同值的數量方法示例
- 單個select語句實現MySQL查詢統計次數
- MYSQL每隔10分鐘進行分組統計的實現方法
- MySQL中幾種數據統計查詢的基本使用教程
- MySQL按時間統計數據的方法總結
- mysql 獲取規定時間段內的統計數據
- MySQL統計函數GROUP_CONCAT使用陷阱分析
- mysql滑動訂單問題原理與解決方法實例分析