Java开发问题记录--查询一段时间内的账单数据
2023-03-20 15:00:02 时间
前言
今天写了一个接口功能,要求查询一段时间内的账单数据。之前没有写过类似功能,此次记录下来方便日后遇到没有头绪。
一、了解需求
开发之前最最重要的是要对需求进行充分了解。
主要就是要求查询一段时间内的账单数据,这里一段时间是只有年月,也就是几个连续的月份的账单数据,且没有账单的月份要填入0取出。月份最多不超过12个月,最少1个月。
数据库已经是写好了数据,剩下的就是写sql和后端方法将数据取出来。
二、代码开发
1.数据库获取数据
1.1、SQL语句:
SELECT
order_id AS orderId,
organ_id AS organId,
GROUP_CONCAT( CASE WHEN sum_fee IS NULL THEN 0.0000 ELSE sum_fee END ) AS fee,
GROUP_CONCAT( bill_month ) AS billMonth
FROM
billTable
WHERE
isvalid = 1
AND bill_month IN ( '2021-01', '2021-02', '2021-03', '2021-04', '2021-05', '2021-06', '2021-07' )
GROUP BY
orderId,
organId
ORDER BY
orderId DESC
LIMIT 10;
此处使用了GROUP BY,对orderId,organId进行分组。
GROUP_CONCAT()方法可将分组的数据取出,用逗号隔开。
月份通过List传入数据库。
1.2、SQL查询效果展示:
可以看到获取的账单金额和月份一一对应,但是月份并不连续,这个sql只能查询到数据库中存在的数据。在后端进行处理,将不存在的账单填入0 。
2.后端数据处理
代码如下:
for(BillDto bill: pageInfo.getList()) {
//获取对应月份的账单数据
String[] arr1 = bill.getBillMonth().split(",");
for (int m = 0; m < arr1.length; m++) {
for(int i = 0; i < yearAndMonths.size(); i++) {
String[] arr2 = bill.getFee().split(",");
if (!Objects.equals(yearAndMonths.get(i), arr1[m])) {
//月份不匹配将账单数据设为0
switch (i) {
case 0:
if(bill.getMonth01() == null){
bill.setMonth01("0.0000");
}
break;
case 1:
if(bill.getMonth02() == null){
bill.setMonth02("0.0000");
}
break;
case 2:
...
case 12:
if(bill.getMonth12() == null){
bill.setMonth12("0.0000");
}
break;
}
} else{
//月份匹配,将对应账单数据插入
switch (i) {
case 0:
bill.setMonth01(arr2[m]);
continue;
case 1:
bill.setMonth02(arr2[m]);
continue;
case 2:
...
case 12:
bill.setMonth12(arr2[m]);
}
}
}
}
}
此处用了两个数组,arr1记录月份,arr2记录账单费用。
yearAndMonth是连续的月份。通过for循环和switch…case语句将月份和费用进行对比。如果yearAndMonth和arr1不匹配,则证明这个月没有费用数据,设为0;匹配,则将对应月份的费用填入。
填入对应数据的Switch…case语句中使用continue是为了填入对应数据后,跳出月份循环,获取数据库中下一条数据进行匹配。
总结
通过此次学习开发,对sql语句和switch…case的使用有了更充分的了解。下次再遇到此类问题,希望可以做一个参考。
相关文章
- 深入探讨Java中的异常与错误处理
- 研究学习Kotlin的一些方法
- 数据显示Java热度持续下落,日子屈指可数?
- 2017年5月编程语言排行榜:Java与C语言优势正开始缩小
- Java多线程之内置锁与显示锁
- Java线程池的理论与实践
- 白话阿里巴巴Java开发手册(编程规约)
- 关于Java你不知道的十件事
- Java服务化系统线上应急和技术攻关,你必须掌握的Linux命令
- Java实现高斯模糊和图像的空间卷积
- Java阻塞队列实现原理分析
- NPM使用技巧
- Node.js对Java开发者而言是什么?
- Java反射机制应用实践
- 理解RxJava中的Single和Completable
- 2017年你不能错过的Java类库
- 大规模集群下的Hadoop NameNode
- 从源码解密Spark内存管理
- 2017年3月编程语言排行榜:Swift首次进入前十
- JVM热点技术:Java类的加载机制