業務需求
最近要在系統中加個統計功能,要求是按指定日期范圍里按天分組統計數據量,並且要能夠查看該時間段內每天的數據量。
解決思路
直接按數據表日期字段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
查詢結果如下圖所示:

