需求:查詢最近12個月的數據量,此處表的名稱為:ticket_ticket
按月查詢數據,sql語句如下:
SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')
查詢結果:
可以看出只有兩個月份,不滿足需求。
解決方案如下:
步驟一:生成一個月份表,包含最近的12個月
sql如下:
SELECT
DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date
FROM
(
SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH )
FROM ticket_ticket LIMIT 12)d
ORDER BY date
結果如下:
步驟二:將查詢結果表並入月份表
sql語句:
SELECT * FROM (
SELECT
DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date
FROM
(
SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH )
FROM ticket_ticket LIMIT 12)d
ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')
)tab ON t=date
結果如下:
步驟三:處理查詢結果:NULL設置為0,並按照月份排序
sql語句:
SELECT date as 月份, IFNULL(tab.num, 0) as 數量 FROM (
SELECT
DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date
FROM
(
SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH )
FROM ticket_ticket LIMIT 12)d
ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')
)tab ON t=date
結果如下:
總結這里用到的sql語句
- DATE_FORMAT(date,format)
定義:用於以不同的格式顯示日期/時間數據。即對時間進行格式轉換
用法:date 參數是合法的日期。format 規定日期/時間的輸出格式。
DATE_FORMAT('2021-02-12','%Y-%m')
輸出:2021-02
- CURDATE()
定義:返回當前日期
用法:直接使用CURDATE()
SELECT NOW(),CURDATE(),CURTIME()
結果: