业务场景

数据库中查询某一段近12个月的数据,但是有的月份无数据,或者有的月份有。如:A在2月份有数据,B在2月份没有。此时如果不从SQL层面查询出来的话则靠业务层写了。或者AB在两月都有。结果如下图1

我们需要给前端返回的数据结构如下:图2

业务层代码

/*** @Author: OUO* @DateTime: 2022/2/18 15:53* @Description: 某站近12个月的数量*/@Overridepublic Map<String, Object> getXungengl() {List<Map<String,Object>> mapList=new ArrayList<>();/** MYSQL查询出来得总数据,解雇如图1 */List<EnforVO> xungengl = enforcementStationMapper.getXungengl();/** 获取近12个月汉化时间 */List<String> dateList = convenienceMapper.getMonth().stream().map(ConvenienceVO::getClickDate).collect(Collectors.toList());/** 获取某站名称 */List<String> nameList = convenienceMapper.getConvenienceStation().stream().map(ConvenienceDO::getStationName).collect(Collectors.toList());/** 判断是否总数据为空 */if (CollectionUtils.isNotEmpty(xungengl)){/** 根据名称集合来循环 */for (String name : nameList) {/** 过滤 匹配某站名称相同的  */List<EnforVO> xungel = xungengl.stream().filter(item -> StrUtil.isNotEmpty(item.getStationName()) && name.equals(item.getStationName())).collect(Collectors.toList());/** 创建一个list String类型的数组  */List<String > data = new ArrayList<>();/** 遍历12个月时间 */for (String month : dateList) {/** 定义布尔类型变量值方便跳出 */boolean flag = false;/** 循环遍历上面已经经过过滤后的总数据 */for (EnforVO vo : xungel) {/** 如果总数居查询的时间与当前遍历的月份时间相等 */if (vo.getInspectTime().equals(month)){/** 往空数组里面加入当前月份的巡更率  */data.add(vo.getPercentage());/** 将变量设置为true */flag=true;/*跳出*/break;}}/** 如果为 true,则为0,代表该站在这个月份无数据*/if (!flag){data.add("0");}}Map<String ,Object> m = new HashMap<>();m.put("num",data);m.put("name",name);mapList.add(m);}}else{//初始化数据时如果数据库中暂无数据for (String name:nameList){List<String> data=new ArrayList<>();for (int i=0;i<12;i++){data.add("0");}Map<String,Object> map=new HashMap<>();map.put("num",data);map.put("name",name);mapList.add(map);}}Map<String, Object> mm = new HashMap<>();mm.put("date",dateList);mm.put("name",nameList);mm.put("data",mapList);return mm;}

MySql代码

SELECTa.*,IFNULL( b.dis_num, 0 ) dis_nums,b.law_station_id,IFNULL( b.station_name, NULL ) station_name
FROM(
SELECTDATE_FORMAT( curdate( ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 11 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 10 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 9 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 8 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 7 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 6 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 5 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 4 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 3 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 2 MONTH ), '%Y年%m月' ) AS click_date UNION ALL
SELECTDATE_FORMAT( date_sub( curdate( ), INTERVAL 1 MONTH ), '%Y年%m月' ) AS click_date
ORDER BYclick_date ) aLEFT JOIN (
SELECTlaw_station_id,sum( case_dis_num ) dis_num,repDate,rep_user_id,rep_user_name,station_name
FROM(
SELECTa.law_station_id,a.case_dis_num,DATE_FORMAT( a.rep_date, '%Y年%m月' ) AS repDate,a.rep_user_id,a.rep_user_name,b.station_name
FROMconvenience aLEFT JOIN t_enforcement_station b ON a.law_station_id = b.law_station_id
WHEREDATE_SUB( CURDATE( ), INTERVAL 12 MONTH ) <= date( rep_date )
ORDER BYrep_date ASC LIMIT 999999999 ) AS ss
GROUP BYrepDate,station_name ) b ON a.click_date = b.repDate

总结

​ 思路在上面注释中都体现了。返回结果如图2

JAVA查询近12个月的数据并进行统计相关推荐

  1. 查询近12个月的数据,没有数据的月份补零

    可以有两种方法实现,一种是纯sql的方式,一种是sql和代码共用的形式 一.纯sql的形式 前半部分用于一个近12个月的表,然后再将查出来的数据和月份表相结合,就是想要的结果 select v.mon ...

  2. MySQL查询近12个月数据,无则补0

    查询近12个月数据,无则补0 select v.month,ifnull(b.count,0) count from (SELECT DATE_FORMAT(CURDATE(), '%Y-%m') A ...

  3. mysql查询前12个月的数据_MySQL 统计过去12个月的数据(包括本月),mysql本月

    MySQL 统计过去12个月的数据(包括本月),mysql本月 1.问题 需要统计过去12个月的数据,如现在是2015年4月,那么我们需要统计从2014年5月到2015年4月的数据情况.而这12个月中 ...

  4. mysql查询近六个月的数据

    一.查询近六个月 SELECT date_format( @lastDay := last_day( date_add( @lastDay, INTERVAL 1 MONTH ) ), '%Y-%m' ...

  5. 你会不会用mysql查询近7个月的数据?没有记录默认为空

    版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/68059203 做报表统计的时候,常常需要在MySQL端用sq ...

  6. SQL搜索近12个月的数据

    企业应用经常用图表来展示用户数据情况,便于企业决策分析:常用的例子就是展示近十二个月的数据(当前月向前起向前推12个月)分布.效果图如下: 那么就要对数据库的数据进行钻取,不管数据库中某个月是否有数据 ...

  7. 查询最近12个月的数据SQL语句

    select * from table_name where DATE_FORMAT(table_name.field,'%Y-%m') > DATE_FORMAT(date_sub(curda ...

  8. MySQL查询统计今年12个月的数据,没有默认为空

    此处先省略二百字的废话 做报表统计的时候,常常需要在MySQL端用sql统计近12个月的数据,或者近30天的数据. 假如遇到当月没有数据,或者当天没有数据时,默认为0. SELECTCASE WHEN ...

  9. 数据库查询近一年来的数据(近三个月、近六个月同理)

    最近在做一个需求,前台需要展示一个折线图,如下: 所以产生了一个问题,如何按照折线图所需,从数据库查询近一年.近三个月.近六个月的数据呢? 对此,我整理了主流数据库mysql.oracle版本的查询方 ...

最新文章

  1. docker——kafka-manager安装
  2. Java09-day09【ArrayList(概述、构造方法、常用方法、遍历)、简易学生管理系统】
  3. oracle1007错误,【问题处理】偶遇ORA- 01075: you are currently logged on错误
  4. git与github学习笔记
  5. ARMv8 MMU及Linux页表映射:TLB
  6. 【报告分享】数据资产化之路----数据资产的估值与行业实践.pdf
  7. python中plt定义,对Python中plt的画图函数详解
  8. Android屏幕适配(SmallestWidth适配 sw限定符)最新步骤解析
  9. 三层交换机LACP协议对 L2/L3端口,报文处理实验
  10. python-图像边缘化处理
  11. hping3对某网站发起ddos攻击
  12. 串口设备短信模块开发笔记
  13. 通过一张照片,获取照片的地址信息
  14. nginx防恶意刷新
  15. Cytoscape Web 实现网络拓扑结构图
  16. 华为云服务器安全组端口开发
  17. java 周总结_Java周总结1
  18. java_web网页版计算器_简单的Web版计算器 - Mr_DeFore的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. 支付宝微信合单支付对接说明
  20. 关于软件可测试性的资料

热门文章

  1. 【2021-09-15】封装、继承、多态(作业)
  2. 南京工业互联网产业联盟成立
  3. 信号与系统时域分析(3)——时域经典法
  4. 目标检测算法综述—— One-Stage方法
  5. 联想 thindBook 13s G2 ITL笔记本开不了机问题
  6. 【听】实验室女孩,热爱到至爱的科学狂人
  7. 你的计划为什么运行不下去?怎么破?
  8. 计算机中的用户内存容量,按照 《2010 通则 》 ,以 CIF 汉堡条件成交,卖方对货物风险应负责...
  9. 3D游戏建模到底需要学习哪些美术基础?新手如何开始学习3D建模?
  10. Swift - String 还是NSString