后端实现行转列 主附表方式(可以直接使用的工具类,附带测试方法,测试结果)

本文主要是介绍后端实现行转列 主附表方式(可以直接使用的工具类,附带测试方法,测试结果),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

后端实现行转列 主附表方式

  • 为什么使用行转列
  • 后端实现行转列的方法
  • 注意事项
  • 使用例子:
    • 测试方法
    • 结果

为什么使用行转列

  有些时候,因为业务问题,我们需要对附表数据进行行转列,比如:工厂中在对产品排生产计划时,会排每一天生产多少产品,而这个每天生产多少是滚动的,这个月有,下个月也有,下一年也有可能有,所以用主附表的方式表现就不是很直观,所以也就需要用到行转列表现到一个表里,再根据时间进行筛选,选择看那一段时间的。

表现形式:
在这里插入图片描述

后端实现行转列的方法

 为了能重复使用,我写了一个实现行转列的方法:
上代码:

package org.jeecg.common.util;import org.jeecg.common.exception.JeecgBootException;import java.util.*;/*** @author dawei*/
public class RowTransforColumn {/*** 进行行转列(主附表式)* @param mainData              主表数据* @param detailData            附表数据* @param relationshipInMain    主表关系字段集合  (请按照对应顺序存放)* @param relationshipInDetail  副表关系字段集合  (请按照对应顺序存放)* @param transforColumn        要进行行转列的字段 (字段名)* @param reansforDate          要进行行转列的字段数据  (字段名)* @param detailColumns         附表列(可不传,如果需要让行转列后的数据 只要某些列 就要填)如果不填请传”null“* @param defaultValue          行转列的列的默认值* @return   合并后的数据放在主表中返回*/public static List<Map<String,Object>> rowTransforColumn(List<Map<String,Object>> mainData,List<Map<String,Object>> detailData,List<String> relationshipInMain,List<String> relationshipInDetail,String transforColumn,String reansforDate,List<String> detailColumns,Object defaultValue){
//        //存放行转列后的结果
//        List<Map> res = new LinkedList<>();
//        Map<String,List<Map<String,Object>>> details = new HashMap<>();Map<String,Object> detailMaps = new HashMap<>();//记录准备指定列if (detailColumns!=null){for(String column:detailColumns){detailMaps.put(column,defaultValue);}}else {//指定列为空 自动定位  遍历附表数据for (Map<String,Object> map:detailData){Object object = map.get(transforColumn);if (object == null){throw new JeecgBootException("转置的列在附表中不存在");}//如果附表数据对应日期存在if (!detailMaps.containsKey(object.toString())){//放入列中detailMaps.put(object.toString(),defaultValue);}}}//记录映射关系Map<String,Map<String,Object>> mainDateMap = new HashMap<>();for (Map<String,Object> mainMap : mainData){//多个关系列组成的唯一标识String key = "";for (String relation:relationshipInMain){Object object = mainMap.get(relation);if (object==null){throw new JeecgBootException("关系列:"+relation+",在主表中不存在");}key+=object.toString()+",";}mainMap.putAll(detailMaps);mainDateMap.put(key,mainMap);}//遍历附表数据for (Map<String,Object> map:detailData){//多个关系列组成的唯一标识String key = "";for (String relation:relationshipInDetail){Object object = map.get(relation);if (object==null){throw new JeecgBootException("关系列:"+relation+",在副表中不存在");}key+=object.toString()+",";}//找关联关系 主表数据Map<String,Object> mainMap = mainDateMap.get(key);if (mainMap!=null){//添加到主表中mainMap.replace(map.get(transforColumn).toString(),map.get(reansforDate));}}return mainData;}
}

注意事项

  • 代码参数,主表数据和附表数据都是map类型;
  • 主表数据和附表数据必须有关联关系。
  • 他们的关系字段可以是多个。但是必须按顺序一一对应;
  • 附表行转列后的数据是直接放进主表数据集合中的;
  • 代码中使用的异常,需要自己进行定义。或者直接抛出Exception也可以。

使用例子:

测试方法

package rowToColumn;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;public class test {public static void main(String[] args) {//主表数据List<Map<String,Object>> planMains = new LinkedList<>();for (int i = 0;i<10;i++){Map<String,Object> mainMap = new HashMap<>();mainMap.put("plan_no",i);mainMap.put("name","jihua"+i);mainMap.put("erp_code","chanpin"+i);planMains.add(mainMap);}//附表数据List<Map<String,Object>> planDetails = new LinkedList<>();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Random random = new Random();for (int i =0;i<10;i++){for (int t = 0;t<5;t++){Date date=new Date();Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(Calendar.DATE,t);date=calendar.getTime();Map<String,Object> detailMap = new HashMap<>();detailMap.put("detail_no",t);detailMap.put("plan_no",i);detailMap.put("plan_time",format.format(date));detailMap.put("plan_num", random.nextInt());planDetails.add(detailMap);}}//主表关系列List<String> relationshipInMain = new LinkedList<>();relationshipInMain.add("plan_no");//附表关系列List<String> relationshipInDetail = new LinkedList<>();relationshipInDetail.add("plan_no");try {List<Map<String,Object>> datas = RowTransforColumn.rowTransforColumn(planMains,planDetails,relationshipInMain,relationshipInDetail,"plan_time","plan_num",null,null);System.out.println(datas);} catch (Exception exception) {exception.printStackTrace();}}
}

结果

转换前:
在这里插入图片描述
转换后:
在这里插入图片描述

这篇关于后端实现行转列 主附表方式(可以直接使用的工具类,附带测试方法,测试结果)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397784

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典