在做前后端分离的项目,仪表板模块,展示的echarts图表,如图:

展示的是当天的前十天的委托单数量,按日期分组统计。感觉很简单嘛,直接一个SQL查询不就搞定了嘛。
后台SQL查询:

postman测试:


仔细一看,好像哪里不对哦,19号 20号怎么没有呢,就算那天没有数据的话,也需要返回给前端来展示呀,数量直接设置0就行了吧!
刚开始想的解决方案是直接在Java代码里遍历一下补充数据,但是直接SQL查询是否可以实现呢,那样就省不少代码呢。。废话不多说,直接上手撸SQL!!
解题思路:
首先用一个查询把指定日期范围的日期列表搞出来,作为一个子表。然后左关联上面原来的查询结果集,日期作为关联字段。如果某天日期数量不存在则直接赋0!
- 构造当前日期之前10天的日期表
结果如下:SELECT @cdate := date_add( @cdate, INTERVAL - 1 DAY ) date FROM ( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 DAY ) FROM APPLY LIMIT 10 ) a

- 关联原来的业务查询:
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
执行结果如下:

搞定!!

1461

被折叠的 条评论
为什么被折叠?



