数据库表的行列转换(行转列,列转行)

news2024/12/24 21:01:10

目录

前言

行转列

创建测试表 score1

插入测试数据

需求与通用SQL写法

列转行

创建测试表 score2

插入测试数据

需求与通用SQL写法


前言

在工作中,多多少少都会遇到一些数据展示的需求,开发一个接口,从数据库中查询数据返回页面展示。表结构是死的,但是查询需求却是非常灵活的。很多时候不是简单的直接从表中直接 select 获取数据就能够直接返回给页面,需要将一些判断,聚合逻辑交给 SQL 来做,才能够得到查询需求中的字段和数据。其中就可能会涉及到一些表行列的转换。

以下用MySQL分别演示下行转列与列转行的业务场景,并给出通用的SQL写法。

行转列

创建测试表 score1

create table score1 (
    id int auto_increment primary key,
    student_id int,
    subject varchar(20),
    score double
);

插入测试数据

insert into score1(student_id, subject, score) values(1, 'chinese', 70);
insert into score1(student_id, subject, score) values(1, 'math', 70);
insert into score1(student_id, subject, score) values(1, 'english', 70);
insert into score1(student_id, subject, score) values(2, 'chinese', 80);
insert into score1(student_id, subject, score) values(2, 'math', 80);
insert into score1(student_id, subject, score) values(2, 'english', 80);
insert into score1(student_id, subject, score) values(3, 'chinese', 90);
insert into score1(student_id, subject, score) values(3, 'math', 90);
insert into score1(student_id, subject, score) values(3, 'english', 90);

需求与通用SQL写法

表中的数据直接查询返回的字段如下所示:

想要返回以下的字段

通用 SQL 写法的思路就是 group by 分组 + 聚合函数 sum() + case when 条件判断 + 字段别名

具体 SQL 示例如下所示:

select student_id, 
  sum(case subject when 'chinese' then score else 0 end) as chinese,
  sum(case subject when 'math' then score else 0 end) as math,
  sum(case subject when 'english' then score else 0 end) as english
from score1 
group by student_id

列转行

创建测试表 score2

create table score2 (
    student_id int auto_increment primary key,
    chinese double,
    math double,
    english double
);

插入测试数据

insert into score2(chinese, math, english) values(70, 80, 90);
insert into score2(chinese, math, english) values(71, 81, 91);
insert into score2(chinese, math, english) values(72, 82, 92);

需求与通用SQL写法

表中的数据直接查询返回的字段如下所示:

想要返回以下的字段

通用 SQL 写法的思路就是  字段别名 + union all

具体 SQL 示例如下所示:

select student_id, 'chinese' as subject, chinese as score from score2 where chinese is not NULL
union all
select student_id, 'math' as subject, math as score from score2 where math is not NULL
union all
select student_id, 'english' as subject, english as score from score2 where english is not NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城,主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览; 后台是…

Langchain核心模块与实战[8]:RAG检索增强生成[loader机制、文本切割方法、长文本信息处理技巧]

Langchain核心模块与实战[8]:RAG(Retrieval Augmented Generation,检索增强生成) RAG(Retrieval-Augmented Generation)技术是一种结合检索和生成功能的自然语言处理(NLP)技术。该技术通过从大型外部数据库中检索与输入问题相关的信息,来辅助生成模型回答问题。其核心…

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…

使用 Arduino 实现 PID 控制器

使用 Arduino 实现 PID 控制器 PID controller implementation using Arduino (microcontrollerslab.com) In this article, you will learn how to design PID controller using Arduino. PID controller can implemented using both analog and digital electronics. But in…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类(修饰类除外)? 一个 Java 文件中是可以存在多个类的,但是一个 Java 文件中只能存在一个 public 所修饰的类,而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化,势必造成CPU资源的浪费,因此优化执行效率的思路是:UI组件不再自行每帧查询血量,而是让血量自己在发生变化的同时通知UI进…

软件全过程建设资料,交付资料,方案等

在软件开发过程中,文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程,还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用,以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档编写…

【机器学习】深入理解损失函数(Loss Functions)

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…

[译] 深入浅出Rust基金会

本篇是对 RustConf 2023中的Rust Foundation: Demystified这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 大家好,我是Sage Griffin,我的代词是they/them。我今天来这里是要谈谈Rust基金会。 要了解基金会实际做什么,我们需要理解美国国内税收…

微软第四季度财报预览:增长动力追踪

微软公司即将在2024年7月30日(周二)美国市场收盘后发布第四季度财务结果。 微软的收益 - 预期如何 美股券商开户通道 市场预计,微软即将到来的2024年第四季度的收入将年增长14.5%,达到644亿美元,高于2023年第四季度…

【Leetcode】二十、记忆化搜索:零钱兑换

文章目录 1、记忆化搜索2、leetcode509:斐波那契数列3、leetcode322:零钱兑换 1、记忆化搜索 也叫备忘录,即把已经计算过的结果存下来,下次再遇到,就直接取,不用重新计算。目的是以减少重复计算。 以前面提…

【.NET 6 实战--孢子记账--从单体到微服务】--开发环境设置

在这一小节,我们将设置开发环境。 一、安装SDK 咱们的项目使用的是 .NET6,开发前我们需要从官网上下载.NET6 SDK(点击下载),这里要注意的是我们需要下载.NET6 SDK,而不是 .NET6 Runtiem 。SDK 包含 Runti…

2021真题-架构师案例(四)

问题1(16分) 针对该系统功能,赵工建议解释器架构风格,李工建议管道过滤架构风格,王工则建议饮食调用,该系统从灵活性和可扩展性考虑,应采用哪种? 解析: 管道-过滤器&am…

这些有用的免费网站和工具,很多人却都不知道

在信息爆炸的今天,很多用户都不知道有哪些免费好用的网站和工具,今天小编就来和大家分享几款免费又好用的网站或工具,以便大家提升工作效率。 滴答清单:高效时间管理 滴答清单是一款广受欢迎的时间管理工具,它可以帮…

【C++】面向对象的软件设计原则

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

字符串变换 482、6、68

482. 密钥格式化&#xff08;简单&#xff09;&#xff08;20mins&#xff09; 给定一个许可密钥字符串 s&#xff0c;仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n 1 组。你也会得到一个整数 k 。 我们想要重新格式化字符串 s&#xff0c;使每一组包含 k 个字…

AndroidStudio 开发环境搭建

文章目录 AndroidStudio 开发环境搭建JDK 下载与安装&#xff0c;配置环境变量JDK1.8 下载安装配置环境变量新建JAVA_HOME编辑Path 下载AndroidStudio最新版本历史版本先安装JDK&#xff0c;后启动AS以管理员身份运行打开解决双击打不开的问题Error:你的主机中的软件中止了一个…

Golang | Leetcode Golang题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; func getHint(secret, guess string) string {bulls : 0var cntS, cntG [10]intfor i : range secret {if secret[i] guess[i] {bulls} else {cntS[secret[i]-0]cntG[guess[i]-0]}}cows : 0for i : 0; i < 10; i {cows min(cntS[i], c…

数据结构——单链表OJ题(下)

目录 一、链表的回文结构 思路一&#xff1a;数组法 &#xff08;1&#xff09;注意 &#xff08;2&#xff09;解题 思路二&#xff1a;反转链表法 &#xff08;1&#xff09; 注意 &#xff08;2&#xff09;解题 二、相交链表 &#xff08;1&#xff09;思路&#…

音频合成之百度飞浆微调保姆级教程

&#x1f3af; 这里我们使用&#xff0c;百度飞浆产品进行操作 至少需要提供一分钟的原声视频&#xff0c;越清晰越好&#xff0c;用于分析人物音色、声纹等特点。预防针&#xff1a;这块稍微有点难度&#xff0c;涉及代码&#xff0c;不过不用担心&#xff0c;照着操作即可。…