当前位置: 首页 > article >正文

行转列实现方式总结

前言

在日常开发中遇到了,需要对表中数据某个字段行数据转成列,个人觉得这中做目前想到两种, 一种是sql 操作, 另一种代码中做逻辑处理。

方式一 Java 操作

import lombok.Data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: bmxc
 * @date: 06/11/2024
 * @description: 把 student 对象中的 sortNum,实现行转成列, sortNum 范围是固定的,解决方式如下
 */
public class Test {
    @Data
    static class Student {
        private String id;
        private String name;
        private Integer sortNum;

    }

    @Data
    static class Student2 {
        private String id;
        private String name;
        private Integer sortNum1;
        private Integer sortNum2;
        private Integer sortNum3;
    }

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student student = new Student();
        student.setId("1");
        student.setName("test1");
        student.setSortNum(1);
        students.add(student);
        Student student1 = new Student();
        student1.setId("1");
        student1.setName("test2");
        student1.setSortNum(2);
        students.add(student1);
        Student student2 = new Student();
        student2.setId("2");
        student2.setName("test3");
        student2.setSortNum(3);
        students.add(student2);
        Student student3 = new Student();
        student3.setId("2");
        student3.setName("test4");
        student3.setSortNum(1);
        students.add(student3);

        // 诉求,把list 对应中的student的 sort_num 转成行,sort_num 是重复的,sort_num的值是一定的,假设是 3, 也即是行转列
        /**
         * 1. 把List转map
         * 2. 循环遍历mao 实现行转列
         */
        Map<String, List<Student>> studentHashMap = new HashMap<>();
        for (Student student4 : students) {
            if (!studentHashMap.containsKey(student4.getId())) {
                studentHashMap.put(student4.getId(), new ArrayList<>());
            }
            studentHashMap.get(student4.getId()).add(student);
        }

        // 构建新的对象,来平铺需要的每个对象中要展示的字段,能实现固定功能,就是比较死板。后续在优化
        for (Map.Entry<String, List<Student>> entry : studentHashMap.entrySet()) {
            List<Student> values = entry.getValue();
            Student2 stu = new Student2();
            if (values.size() > 0) {
                // 筛入基本值
                Student student4 = values.get(0);
                stu.setId(student4.getId());
                stu.setName(student4.getName());
            } else if (values.size() == 1) {
                Student stu0 = values.get(0);
                stu.setSortNum1(stu0.getSortNum());
            } else if (values.size() == 2) {
                Student stu0 = values.get(0);
                Student stu1 = values.get(1);
                stu.setSortNum1(stu0.getSortNum());
                stu.setSortNum2(stu1.sortNum);
            } else if (values.size() == 3) {
                Student stu0 = values.get(0);
                Student stu1 = values.get(1);
                Student stu2 = values.get(2);
                stu.setSortNum1(stu0.getSortNum());
                stu.setSortNum2(stu1.sortNum);
                stu.setSortNum3(stu2.sortNum);
            }
        }
    }

}

方式二 sql 操作
select 
t.sortNum
,t1.sortNum as sortNum1
,t2.sortNum as sortNum2
from student t
left join student t1
on t1.id=t.id
left join student t2
on t2.id=t.id


http://www.kler.cn/a/387453.html

相关文章:

  • 【PGCCC】Postgresql Toast 原理
  • 云计算:定义、类型及对企业的影响
  • 如何优化Elasticsearch的查询性能?
  • 动态规划 —— dp 问题-买卖股票的最佳时机IV
  • SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)
  • 2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习
  • vue,uniapp,微信小程序解决字符串中出现数字则修改数字样式,以及获取字符串中的数字
  • SpringBoot API版本控制策略详解
  • 【前端】Svelte:动画效果
  • 华为机试HJ33 整数与IP地址间的转换
  • 【复旦微FM33 MCU 开发指南】ADC
  • 微服务中常用分布式锁原理及执行流程
  • delphi 编译多语言工程 error RC2104 : undefined keyword or key name:
  • js id字符串转数组
  • 学习threejs,使用JSON格式保存和加载整个场景
  • Chromium127编译指南 Mac篇(二)- 安装Xcode
  • 【工具】VeraCrypt|Windows 怎么给磁盘文件夹加密码?开源磁盘加密工具 VeraCrypt 教程
  • 青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
  • 暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费
  • SpringBoot Java教学辅助平台:构建高效学习环境
  • LeetCode每日一题3235---判断矩形的两个角落是否可达
  • hadoop+spark中8088,18080,19888,4040端口页面的区别
  • Windows Server服务器上安装的MySQLl数据库连接遇到10055错误
  • FastReport将停止 .NET Framework 上的 WebReport 更新
  • 【JS】如何设置一个只读属性
  • 手把手教你写Unity3D飞机大战(5)玩家子弹射击之显示瞄准图标