Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示

在做前后端分离的项目,仪表板模块,展示的echarts图表,如图:
Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第1张图片
展示的是当天的前十天的委托单数量,按日期分组统计。感觉很简单嘛,直接一个SQL查询不就搞定了嘛。
后台SQL查询:
Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第2张图片
postman测试:
Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第3张图片
Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第4张图片
仔细一看,好像哪里不对哦,19号 20号怎么没有呢,就算那天没有数据的话,也需要返回给前端来展示呀,数量直接设置0就行了吧!

刚开始想的解决方案是直接在Java代码里遍历一下补充数据,但是直接SQL查询是否可以实现呢,那样就省不少代码呢。。废话不多说,直接上手撸SQL!!

解题思路:
首先用一个查询把指定日期范围的日期列表搞出来,作为一个子表。然后左关联上面原来的查询结果集,日期作为关联字段。如果某天日期数量不存在则直接赋0!

  1. 构造当前日期之前10天的日期表
    SELECT
    	@cdate := date_add( @cdate, INTERVAL - 1 DAY ) date 
    FROM
    	( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 DAY ) FROM APPLY LIMIT 10 ) a
    
    结果如下:
    Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第5张图片
  2. 关联原来的业务查询:
SELECT
	IFNULL( bbb.num, 0 ) num,
	aaa.date 
FROM
	(
	SELECT
		@cdate := date_add( @cdate, INTERVAL - 1 DAY ) date 
	FROM
		( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 DAY ) FROM APPLY LIMIT 10 ) a 
	) aaa
	LEFT JOIN (
	SELECT
		COUNT(*) num,
		DATE( CREATE_DATE ) `date` 
	FROM
		`APPLY` 
	WHERE
		`STATUS` >= 1 
		AND ( TRUSTEE_1ST = 1285764105629650946 OR TRUSTEE_2ND = 1285764105629650946 ) 
		AND DATE( CREATE_DATE ) >= DATE_SUB( CURDATE(), INTERVAL 10 DAY ) 
		AND DATE( CREATE_DATE ) <= CURDATE() 
	GROUP BY
		DATE( CREATE_DATE ) 
	ORDER BY
	CREATE_DATE 
	) bbb ON bbb.`date` = aaa.date

查询结果如下:
Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第6张图片

2020-12-24扩展知识:

  • 如何获取当前月份的前12个月呢??

SQL如下:

SELECT
	DATE_FORMAT( @cdate := date_add( @cdate, INTERVAL - 1 MONTH ), '%Y-%m' ) date1 
FROM
	( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 MONTH ) FROM APPLY LIMIT 12 ) a

执行结果如下:
Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示_第7张图片

搞定!!

你可能感兴趣的:(java,mysql,sql,数据库)