MySQL實現按天分組統計,提供完整日期列表,無數據自動補0


業務需求
最近要在系統中加個統計功能,要求是按指定日期范圍里按天分組統計數據量,並且要能夠查看該時間段內每天的數據量。

解決思路
直接按數據表日期字段group by統計,發現如果某天沒數據,該日期是不出現的,這不太符合業務需求。百度一番發現方案大致有兩種:一是新建日期列表,把未來10年的日期放進去,然后再跟統計表作連接查詢;二是用程序代碼在SQL邏輯中union多個連續日期查詢。都比較繁瑣。
參考Oracle的“select level from dual connect by level < 31”的實現思路:
1、先用一個查詢把指定日期范圍的日期列表搞出來

SELECT 
    @cdate: = date_add(@cdate, interval - 1 day) as date_str, 0 as date_count
FROM(SELECT @cdate: = date_add(CURDATE(), interval + 1 day) from t_table1) t1

2、業務統計查詢也按上述日期查詢給統計日期和數量設置別名

SELECT
    FROM_UNIXTIME(m.sdate, '%Y-%m-%d') as date_str, count( * ) as date_count
from t_table1 as m
group by FROM_UNIXTIME(m.sdate, '%Y-%m-%d')

3、把兩個查詢用左連接合起,沒數量的日期填0

SELECT t1.date_str, COALESCE(t2.date_total_count, 0) as date_total_count
FROM(
    SELECT @cdate: = date_add(@cdate, interval - 1 day) as date_str FROM(SELECT @cdate: = date_add(CURDATE(), interval + 1 day) from t_table1) tmp1 WHERE @cdate > '2018 - 12 - 01'
) t1
LEFT JOIN(
    SELECT FROM_UNIXTIME(m.sdate, '%Y-%m-%d') as date_str, count(*) as date_total_count FROM t_table1 as m WHERE m.sdate between XXXX and XXXXX GROUP BY FROM_UNIXTIME(m.sdate, '%Y-%m-%d')
) t2
on t1.date_str = t2.date_str

查詢結果如下圖所示:

 


免責聲明!

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



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