Java计算同比环比
Java计算同比环比
同比环比计算基本概念和计算公式
同比率:本年数据比上一年数据增长或减少的比率
同比率计算公式:rate = (本年数据 - 前一年数据) / 前一年数据
实例:2020年10月游客数量为80W,2019年10月游客数量为100W,2018年10月游客数量为90W
2020年同比率为:rate :(80 - 100)/100 * 100%= -20%
2019年同比率为:rate :(100 - 900)/900 * 100%= +11%
(“+” 为增长,“-”为降低)
环比率:本月(季度)数据比上个月(季度)数据增长或减少的比率
环比率计算公式:rate = (本月数据 - 上个月数据) / 上个月数据
实例:2020年10月游客数量为100W,2020年9月游客数量为90W,2020年7月游客数量为80W
2020年10月同比率为:rate :(100 - 90)/90 * 100%= +11%
2019年10月同比率为:rate :(90- 80)/800 * 100%= +12.5%
注:同比环比计算公式是相同的,但计算数据对应的时间是不同的
代码实现逻辑
通过Calendar等时间函数和HashMap,[ hashmap(key,value) key为时间,value为该时间对应的值]。将key和value一一对应的存入集合中,通过对key进行操作,再用key获取HashMap中相对应的value,套公式计算(重点在于对时间(key)的操作,通过key可直接获取value进行计算)
详细逻辑步骤
首先通过SQL语句获取数据库中相应的时间和该时间对应的数据,按时间分组排序
SELECTDATAS.DATE AS NAME ,SUM( DATAS.VISITORSUM) AS VALUE,2 AS sfzj,'' AS bfbFROM(SELECT TOURIST.* ,CONCAT(YEAR,'年',QUARTER,'月') AS DATEFROM TOURISTFLOW TOURIST)DATASGROUP BY DATAS.DATEORDER BY DATAS.DATE
接着设置时间范围,将最早的时间减去一年设为最小时间,最后的时间为最大时间,以此为范围即可保证覆盖所有数据
// 设置时间范围// 获取最前的时间的第一个列表analyzeBean firstTimeSubway = analyzeByYear.get(0);String startTime = firstTimeSubway.getTime();// 获取最后时间的最后一个列表analyzeBean endTimeSubway = analyzeByYear.get(analyzeByYear.size() - 1);String endTime = endTimeSubway.getTime();// 时间格式转换SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月");Date parse = format.parse(startTime);Date parse1 = format.parse(endTime);Calendar c = Calendar.getInstance();c.setTime(parse);c.add(Calendar.YEAR, -1);Date y = c.getTime();// 获取最前的时间的前一年的时间作为查询范围String firstTime = format.format(y);analyzeRequestBean.setStartTime(firstTime);Calendar c1 = Calendar.getInstance();c1.setTime(parse1);Date y1 = c1.getTime();// 获取最后一年的时间作为查询范围String lastTime = format.format(y1);analyzeRequestBean.setStartTime(lastTime);
在将所有数据的结果集存入HashMap中 hash(key,value) key为时间,value为数据值
hashMap.put(time, analyzeByYear.get(i).getValue());
最后通过for循环和CaleCndar函数和Date函数对时间(key)进行相应的操作,再通过时间(key)到HashMap中找对应的值进行计算
for (int i = 0; i < analyzeByYear.size(); i++) {AnalyzeBean analyzeBean = analyzeByYear.get(i);if (i == 0) {// 是否增长("0:降低 1:增加 2:既不增长也不降低")analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月");// 当前数据Date parse2 = format2.parse(analyzeBean.getTime());Calendar c2 = Calendar.gaetInstance();c2.setTime(parse2);c2.add(Calendar.YEAR, 0);Date t = c2.getTime();String time = format2.format(t);Integer value = hashMap.get(time);// 往年数据Date parse3 = format2.parse(time);Calendar c3 = Calendar.getInstance();c3.setTime(parse3);c3.add(Calendar.YEAR, -1);Date year = c3.getTime();String time1 = format2.format(year);Integer value1 = hashMap.get(time1);if (null != value1 && null != value) {if (value.equals(value1)) {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {if (value > value1) {analyzeBean.setSfzj(1);} else {analyzeBean.setSfzj(0);}// 2个值减法 绝对值int abs = Math.abs(value - value1);float a = (float) (abs) / (float) value1 * 100;analyzeBean.setBfb(a + "");}} else {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);}}}
同比实例代码:
// 求同比@Overridepublic Result getAnalyzeByYear(AnalyzeRequestBean analyzeRequestBean) {try {// 检查参数if (null == analyzeRequestBean) {return ResultUtil.fail(ResultEnum.PARAMS_ERROR);}
aList<AnalyzeBean> analyzeByYear= InfoMapper.getAnalyzeByYear(analyzeRequestBean);if (analyzeByYear == null || analyzeByYear.size() == 0) {return ResultUtil.ok(null);}// 设置时间范围// 获取最前的时间的第一个列表analyzeBean firstTimeSubway = analyzeByYear.get(0);String startTime = firstTimeSubway.getTime();// 获取最后时间的最后一个列表analyzeBean endTimeSubway = analyzeByYear.get(analyzeByYear.size() - 1);String endTime = endTimeSubway.getTime();// 时间格式转换SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月");Date parse = format.parse(startTime);Date parse1 = format.parse(endTime);Calendar c = Calendar.getInstance();c.setTime(parse);c.add(CaleCndar.YEAR, -1);Date y = c.getTime();// 获取最前的时间的前一年的时间作为查询范围String firstTime = format.format(y);analyzeRequestBean.setStartTime(firstTime);Calendar c1 = Calendar.getInstance();c1.setTime(parse1);Date y1 = c1.getTime();// 获取最后一年的时间作为查询范围String lastTime = format.format(y1);analyzeRequestBean.setStartTime(lastTime);// 把大范围的结果集都放入hashMap中HashMap<String, Integer> hashMap = new HashMap<>();for (int i = 0; i < analyzeByYear.size(); i++) {analyzeBean analyzeBean = analyzeByYear.get(i);SimpleDateFormat format1 = new SimpleDateFormat("yyyy年MM月");Date parse2 = format1.parse(analyzeBean.getTime());Calendar c2 = Calendar.getInstance();c2.setTime(parse2);c2.add(Calendar.YEAR, 0);Date t = c2.getTime();String time = format1.format(t);hashMap.put(time, analyzeByYear.get(i).getValue());}for (int i = 0; i < analyzeByYear.size(); i++) {AnalyzeBean analyzeBean = analyzeByYear.get(i);if (i == 0) {// 是否增长("0:降低 1:增加 2:既不增长也不降低")analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月");// 当前数据Date parse2 = format2.parse(analyzeBean.getTime());Calendar c2 = Calendar.gaetInstance();c2.setTime(parse2);c2.add(Calendar.YEAR, 0);Date t = c2.getTime();String time = format2.format(t);Integer value = hashMap.get(time);// 往年数据Date parse3 = format2.parse(time);Calendar c3 = Calendar.getInstance();c3.setTime(parse3);c3.add(Calendar.YEAR, -1);Date year = c3.getTime();String time1 = format2.format(year);Integer value1 = hashMap.get(time1);if (null != value1 && null != value) {if (value.equals(value1)) {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {if (value > value1) {analyzeBean.setSfzj(1);} else {analyzeBean.setSfzj(0);}// 2个值减法 绝对值int abs = Math.abs(value - value1);float a = (float) (abs) / (float) value1 * 100;analyzeBean.setBfb(a + "");}} else {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);}}}return ResultUtil.ok(analyzeByYear);} catch (ParseException ex) {ex.printStackTrace();}return ResultUtil.ok(null);
环比类似,只是把c.add(Calendar.YEAR, 0);换成c.add(Calendar.MONTH, 0)
实现逻辑其实不难,只是我写复杂了,如有更好的方法欢迎留言交流讨论## Java计算同比环比
Java计算同比环比相关推荐
- 【Mysql实战】使用存储过程和计算同比环比
背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...
- java时间计算同比环比周的问题
问题描述: 在业务中会有传不同日期格式, 1.有天(2020-02-29),周(2020-03第三周),月(2020-02二月份), 2.同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2 ...
- Oracle如何根据一个日期计算同比环比的日期
iamlaosong文 在写统计查询的SQL语句时,经常会碰到根据一个查询日期推演其它日期的问题,如同比.环比等. 1.字符串转换成日期:to_date('2016-6-16', 'yyyy-mm-d ...
- 计算同比 环比_PowerBI学习教程(三)时间累积同比环比计算
YOY 同比增长率( Year Over Year): 按年度计的增长率 MOM 环比增长率 (Month Over Month): 按月度计的增长率 YTD 年累计 (Year to Date): ...
- 同比环比日期计算、本周一、本周日、上周一、上周日(mysql)
目录 1 所需基础日期查询实现 2 根据业务表实际查询操作 2.1 简单查询 2.2 查询优化: 2.3 在mybatis中 查询,关联业务信息实现 1 所需基础日期查询实现 (1)在计算同比环比时 ...
- 怎么做蒙特卡洛计算npv_PowerBI非标准日历下的同比环比计算,你知道怎么做吗?...
对于按照自然年月日来分析的业务数据,在PowerBI中可以轻松的使用时间智能函数来进行各种时间指标的计算,但如果不是按标准的日历,很多人就开始有点懵,不知道该如何计算了. 比如有的公司的业务月份是从 ...
- SQL计算日环比、周同比
计算日环比.周同比 范例表格如下: 这是面试问到的一个问题,回来学习之后了解可以用这个函数: 计算日活的日环比,周同比: 代码如下: select date,dau,(dau-dau_1)/dau_1 ...
- Power BI中计算同比、环比
财务需求中经常要求计算数据的同比.环比,下面介绍如何在Power BI 中创建用来计算同比和环比的度量值(SSAS模型中同理)... 现金表中有金额,时间(时间需要连续的年月日格式),计算同比.环比. ...
- 计算同比、环比的一些常识性问题
什么鬼 我想在这篇文章中说明的是在计算同比.环比的值的时候,会遇到的一些问题.这些问题如下: 环比月天数不一致 同比周数不一致 可比&全同比 在这一小节里面,我先不说上面的四个问题,我想说的是 ...
- ORACLE 计算某个变量的同比环比
计算同比.环比是数据分析工作中常见的工作,虽然理论简单,但是sql计算还是有点繁琐,先把我提炼出来的模板总结如下,方便日后直接使用. select b1.唯一标识,b1.目标年月,b1.变量,roun ...
最新文章
- 2022-2028年中国完全生物降解塑料产业发展动态及投资前景预测报告
- 参照WebStorm设置VSCode快捷键Alt+Enter快速修复部分报错代码(默认是Ctrl+.)
- android 星星流逝动画,Android Loading动画分析--续集
- hdu2167 方格取数 状态压缩dp
- 桌面图标计算机的意义,关于电脑桌面图标的3个古老问题,答对一个都是高手,你会几个?...
- C#委托,事件理解入门 (译稿)
- android 生成apk名字自动已,Jenkins打包android应用时自动签名apk详解
- 几种常见的跨域原理的实现
- 一款轻量级android图表组件SimpleChart-Kotlin
- VB编程的RS485通讯操作界面源码 本程序适应各类带RS485通讯的设备,参数可以自由修改,主要是针对各类变频器RS485通讯(RTU)格式!
- postgresql如何优雅地清理磁盘空间碎片VACUUM
- excel中使用vlookup函数筛选时遇到#N/A 错误
- wireshark抓取手机app包
- C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)
- 解决office的PPT和WPS的PPT不兼容的问题
- js数组拆分成几个数组
- 64位win7下安装keras的过程
- linux系统的wps办公软件,wps32位/64位linux版办公软件-WPS Office 2019 For Linux下载V11.1.0.10161官方版-西西软件下载...
- 云原生之docker详细知识技能介绍与实战
- python的积木式编程