MySQL統計近30天的數據,無數據的填充0。 這個應該是我們在做統計分析的時候,經常遇到的一個需求。
先說一般的實現方式,就是按照日期進行分組,但是這樣會有一個問題,如果數據庫表中有一天沒有數據,那么是統計不出來結果的。類似下圖
2020-01-01 10
2020-01-03 20
2020-01-04 4
這個時候,我們發現,2020-01-02 這一天是沒有數據的,我們希望沒有數據的這一天也能返回日期,而對應的數據是0,期望如下:
2020-01-01 10
2020-01-02 0
2020-01-03 20
2020-01-04 4
這時候,單單group by就沒辦法實現了。
那應該怎么辦呢?
一般情況就是我們應該先獲取一個日期的虛擬表,把這30天的時間都列出來,然后用這個日期虛擬表再去關聯我們的業務表,關聯沒數據的值設置為空即可,那么怎么得到近30天的日期的,給出sql實現方式
SELECT
@s := @s + 1 AS indexs,
DATE_FORMAT( DATE( DATE_SUB( CURRENT_DATE, INTERVAL @s DAY ) ), '%Y-%m-%d' ) AS dates
FROM
mysql.help_topic,
( SELECT @s := -1 ) temp #不想包含當天,@s:=0
WHERE
@s < 30
ORDER BY
dates
運行得到的結果如下
當然可根據自己的需要進行排序,時間有了,接下來直接關聯自己的業務表就可以了,給出demo:
SELECT
date_table.dates AS dateValue,
IFNULL( temp.count, 0 ) AS count
FROM
(
SELECT
@s := @s + 1 AS indexs,
DATE_FORMAT( DATE( DATE_SUB( CURRENT_DATE, INTERVAL @s DAY ) ), '%Y-%m-%d' ) AS dates
FROM
mysql.help_topic,
( SELECT @s := 0 ) temp
WHERE
@s < 30
ORDER BY
dates
) date_table
LEFT JOIN (
SELECT LEFT
( create_time, 10 ) AS dateValue,
count( * ) AS count
FROM
monitor_log_record t1
WHERE
t1.log_type = 1
AND t1.error_type = 1
AND t1.project_id = 1
GROUP BY
LEFT ( create_time, 10 )
) temp ON date_table.dates = temp.dateValue
ORDER BY
date_table.dates DESC
好了,記錄一下,希望可以幫助到你。有幫助的話記得點贊收藏加關注,感謝!!