zl程序教程

您现在的位置是:首页 >  Java

当前栏目

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的使用有了更充分的了解。下次再遇到此类问题,希望可以做一个参考。