SQL查詢當前月每天的數據量,沒有補0


需求: 查詢當前月每天的數據量,此處表的名稱為:ticket_ticket

直接上sql:

SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket 
AND YEAR(create_at)=YEAR(CURDATE()) 
AND MONTH(create_at)=MONTH(CURDATE())  
GROUP BY DATE(create_at)

查詢結果如下:

可以看出時間不連貫,沒有2021-01-03的數據。如果沒有特殊要求這樣的數據沒有問題,但我這邊是用來畫折線圖的,所以必須是連貫性的數據。

解決方法如下:

步驟一:生成一個日期表

sql如下:

SELECT
	@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
	( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY ) 
	FROM ticket_ticket
	)d1
	WHERE YEAR(@cdate)=YEAR(CURDATE()) 
	AND MONTH(@cdate)=MONTH(CURDATE()) 
	AND DAY(@cdate) > 1
	ORDER BY date

結果如下:

步驟二:將查詢結果表並入日期表

sql如下:

SELECT * FROM (
SELECT
	@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
	( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY ) 
	FROM ticket_ticket
	)d1
	WHERE YEAR(@cdate)=YEAR(CURDATE()) 
	AND MONTH(@cdate)=MONTH(CURDATE()) 
	AND DAY(@cdate) > 1
	ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket WHERE flow_id=336 AND YEAR(create_at)=YEAR(CURDATE()) AND MONTH(create_at)=MONTH(CURDATE())  GROUP BY DATE(create_at)
)tab ON DATE(t)=date

結果如下:

步驟三:處理查詢結果:NULL設置為0,並按照日期排序

sql如下:

SELECT date as 日期, IFNULL(tab.num, 0) as 數量 FROM (
SELECT
	@cdate := date_add( @cdate, INTERVAL - 1 DAY ) as date
FROM
	( SELECT @cdate := date_add(CURDATE(), INTERVAL + 1 DAY ) 
	FROM ticket_ticket
	)d1
	WHERE YEAR(@cdate)=YEAR(CURDATE()) 
	AND MONTH(@cdate)=MONTH(CURDATE()) 
	AND DAY(@cdate) > 1
	ORDER BY date
)date_c LEFT JOIN (
SELECT COUNT(*) as num, DATE(create_at) as t
FROM ticket_ticket WHERE flow_id=336 AND YEAR(create_at)=YEAR(CURDATE()) AND MONTH(create_at)=MONTH(CURDATE())  GROUP BY DATE(create_at)
)tab ON DATE(t)=date
ORDER BY date;

結果如下:

總結這里用到的sql

  • ORDER BY
    定義:用於對結果集按照一個列或者多個列進行排序。默認按照升序,如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字
    用法:
SELECT column_name
FROM table_name
ORDER BY column_name ASC|DESC;
  • DATE_ADD(date,INTERVAL expr type)
    定義:向指定日期添加指定的時間間隔
    用法:date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔,可以為正數+3,也可以為負數-3。type是間隔的類型,可以是天DAY,也可以是MONTH,也可以是其他的。

  • DATE(date)
    定義: 提取日期或日期/時間表達式的日期部分
    用法:date參數可以為日期‘2020-02-19’,也可以為時間‘2020-02-19 12:20:12’,最終結果都為‘2020-02-19’

  • LEFT JOIN
    定義:從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
    用法:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

其中ON為合並條件,如果想直接合並,可以使用ON 1

  • IFNULL(expr1,expr2)
    定義:如果expr1字段為NULL,則返回值expr2


免責聲明!

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



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