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

在做前后端分离的项目,仪表板模块,展示的echarts图表,如图:
在这里插入图片描述
展示的是当天的前十天的委托单数量,按日期分组统计。感觉很简单嘛,直接一个SQL查询不就搞定了嘛。
后台SQL查询:
在这里插入图片描述
postman测试:
在这里插入图片描述
在这里插入图片描述
仔细一看,好像哪里不对哦,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
    
    结果如下:
    在这里插入图片描述
  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

查询结果如下:
在这里插入图片描述

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

执行结果如下:
在这里插入图片描述

搞定!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值