最近开发又是碰到了统计;
按照每天展示24小时数据,每月展示每天数据;每年展示每月数据;无数据补0。

之前开发过类似的统计,每次看到某个时间无数据也要展示出来对应的时间以及数据补0;就很无语。

现在市面既有补0的做法;也有不补0的做法:

不补0对于数据统计来说简洁明了,一个单表分组查询完事。(也就是在前端展示时,某个时间没有数据则不展示该时间,对于用户来说,其实可以接受)

补0的做法在市面相对更广泛一些,就是某个时间没有数据也展示出来该时间且对应数据补0。

那这个时候后端程序员就开始头疼了,尤其是当数据库表设计的不合理时,要统计的数据还要关联三四个表,或者要统计的数据逻辑复杂,统计表时写的sql复杂到令人头皮发麻,(有人就说怎么不用存储过程呢,把统计的每个数据写到临时表里,这样不就可以了吗,想简单了,是统计一个数据就复杂到写小百行sql,无语到极致)。
好了,废话不多说了,给大家看看效果,

按小时分组,统计指定某天的数据,无数据补0

获取某天每小时的数据,若是想获取24小时的话,则小时设为23,
若是想获取当天动态的话,可以用sysdate()代替CONCAT('2022-12-12',' 23:59:59')


	SET  @i=-1;
	SELECT  DATE_FORMAT(DATE_SUB(CONCAT('2022-12-12',' 23:59:59'),INTERVAL ( (@i:=@i+1) ) HOUR ),'%H') AS dateTime			
	FROM  mysql.help_category 
	WHERE @i<23
	order by dateTime asc

效果如下:

mysql 查不到显示0 mysql查询不到的数据补0_数据库

关联要查询的表数据之后:效果如下

mysql 查不到显示0 mysql查询不到的数据补0_mysql 查不到显示0_02

按天分组统计某个时间段的数据,无数据补0

利用Mysql服务器自带的系统表,进行获取某段日期的每天时间
2022-12-12 :开始日期;
2022-12-25 :结束日期;


SELECT RIGHT
	( date_add( date_sub( '2022-12-12', INTERVAL 1 DAY ), INTERVAL ( cast( help_topic_id AS signed INTEGER ) + 1 ) DAY ), 5 ) dateTime 
FROM
	mysql.help_topic 
WHERE
	help_topic_id < DATEDIFF(
	'2022-12-15',
	date_sub( '2022-12-12', INTERVAL 1 DAY ))

获取2022-12-12到2022-12-15之间 的每一天日期,效果如下

mysql 查不到显示0 mysql查询不到的数据补0_mysql_03

关联要查询的表进行查询,效果如下

mysql 查不到显示0 mysql查询不到的数据补0_数据_04


按照月分组;统计某年每月的数据,无数据补0(当年时间截至到当月,过去时间则是十二个月)

mysql 查不到显示0 mysql查询不到的数据补0_mysql 查不到显示0_05

大概就是这么多了,有不明白需要详细sql的话可以前往此处下载,包含相关表和存储过程 mysql分组统计无数据补充0