1.問(wèn)題復(fù)現(xiàn):
按照天數(shù)統(tǒng)計(jì)每天的總數(shù),如果其中有幾天沒(méi)有數(shù)據(jù),那么group by 返回會(huì)忽略那幾天,如何填充0?如下圖,統(tǒng)計(jì)的10-3~10-10 7天的數(shù)據(jù),其中只有8號(hào)和10號(hào)有數(shù)據(jù),這樣返回,數(shù)據(jù)只有2個(gè),不符合報(bào)表統(tǒng)計(jì)的需求。期望沒(méi)有值填0
2.換個(gè)思維:
我們用一組連續(xù)的天數(shù)作為左表然后left join 要查詢的數(shù)據(jù) 最后group by.:連續(xù)天數(shù)表 t1 left join 業(yè)務(wù)數(shù)據(jù) t2 group by t1.day ,如下圖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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 連續(xù)天數(shù)表
1
2
3
4
5
6
7
8
|
SELECT @cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY ) DAY FROM ( SELECT @cdate := DATE_ADD( '20171219' , INTERVAL + 1 DAY ) FROM order ) t0 LIMIT 7 |
執(zhí)行結(jié)果如下:
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條的即可,執(zhí)行結(jié)果如下:
4.@cdate := DATE_ADD(@cdate, INTERVAL - 1 DAY) DAY
把定義的cdate變量天數(shù)-1(自減)
5.LIMIT 7 限制一下條數(shù),大功告成,我們得到了指定日期往前7天的記錄
2.2 左關(guān)聯(lián)然后分組
left join group by t1.day
即按照左表關(guān)聯(lián)業(yè)務(wù)數(shù)據(jù),根據(jù)左表的日期分組,即分成了指定的7天數(shù)據(jù),有記錄就統(tǒng)計(jì)條數(shù),沒(méi)有記錄就是0
最終執(zhí)行結(jié)果:
總結(jié)
以上所述是小編給大家介紹的mysql按照天統(tǒng)計(jì)報(bào)表當(dāng)天沒(méi)有數(shù)據(jù)填0的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!
原文鏈接:http://www.cnblogs.com/dennyzhangdd/p/8073181.html