配合前端实现近一年的数据总量分月展示,
image.png
需要的数据结果如下:
企业微信截图_16514506312235.png
这个结构是对一个单表的数据进行去查询分组让后统计,但是有的月份没有数据的换DATE列就不会显示出来在给到前端的数据中就会不是12个月的数据。
所以就需要在统计的时候就将近一年的月份展示出来,让后再与表数据进行关联
sql为

SELECT a.date,ifnull(b.num,0) signacontract FROM (
SELECT TO_CHAR(当前时间, 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-1), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-2), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-3), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-4), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-5), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-6), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-7), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-8), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-9), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-10), 'yyyy-MM') AS date UNION
SELECT TO_CHAR(add_months(curdate() ,-11), 'yyyy-MM') AS date 
) a left join
(
SELECT COUNT(1) num,TO_CHAR(rq, 'yyyy-MM') rqFROM yw_htxx WHERE 
rq>TO_DATE(TO_CHAR(add_months(当前时间 ,-12), 'yyyy-MM'),'yyyy-MM') AND rq<= 当前时间 
GROUP BY TO_CHAR(rq, 'yyyy-MM')
) b  on a.date = b.rq
ORDER BY a.date  

其中a表的查询就是获取当前时间让后往上推11个月,得到近一年的日期(
示例使用的是达梦数据库,add_months函数是在指定日期上增加指定的月数,TO_CHAR将时间转为特定的格式,不同的数据库用到的函数可能不一样)。
b表则是将要统计的表对时间分组后进行数量统计,最后将两个表通过时间关联起来,对时间进行排序可得到最终的结果集。