Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySql中应该如何将多行数据转为多列数据

MySql中应该如何将多行数据转为多列数据

作者头像
用户1289394
发布于 2023-08-22 08:16:52
发布于 2023-08-22 08:16:52
2.8K02
代码可运行
举报
文章被收录于专栏:Java学习网Java学习网
运行总次数:2
代码可运行

MySQL 中,将多行数据转为多列数据一般可以通过使用 PIVOT(也称为旋转表格)操作来实现。但是,MySQL 并没有提供原生的 PIVOT 操作。不过,可以使用 MySQL 的 GROUP BY 和 CASE WHEN 语句来自定义实现。

下面提供两种实现方法:

方法一:使用 GROUP BY 和 CASE WHEN

假设我们有一个名为 student 的学生表,其中包含学生姓名(name)、课程名称(course_name)和成绩(score)三个字段。现在需要将同一学生的所有课程成绩,按照每个学生一行展示出来。可以使用如下 SQL 语句实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
复制代码SELECT 
    name,
    MAX(CASE WHEN course_name = '语文' THEN score END) AS Chinese,
    MAX(CASE WHEN course_name = '数学' THEN score END) AS Mathematics,
    MAX(CASE WHEN course_name = '英语' THEN score END) AS English
FROM 
    student
GROUP BY 
    name;

这条 SQL 语句执行的步骤是:

  1. 根据学生姓名分组;
  2. 在每个分组内,使用 CASE WHEN 语句根据课程名称动态生成一列新的值;
  3. 使用 MAX() 函数筛选出每个分组中的最大值,并命名为对应的课程名称;
  4. 将结果按照学生姓名进行聚合返回。

方法二:使用 GROUP_CONCAT 函数

除了第一种方法,也可以使用 GROUP_CONCAT() 函数和 SUBSTRING_INDEX() 函数快速将多行数据转为多列数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
复制代码SELECT 
    name, 
    SUBSTRING_INDEX(GROUP_CONCAT(score ORDER BY course_name), ',', 1) AS Chinese,
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(score ORDER BY course_name), ',', 2), ',', -1) AS Mathematics,
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(score ORDER BY course_name), ',', 3), ',', -1) AS English
FROM 
    student
GROUP BY 
    name;

这条 SQL 语句执行的步骤是:

  1. 根据学生姓名分组;
  2. 使用 GROUP_CONCAT() 函数按照 course_name 的排序顺序,将 score 合并成一个字符串;
  3. 使用 SUBSTRING_INDEX() 函数截取合并后的字符串中需要的值,并进行命名;
  4. 将结果按照学生姓名进行聚合返回。

需要注意的是,GROUP_CONCAT() 函数会有长度限制,要转化的字符数量过多可能引起溢出错误。

总结

以上两种实现方法都能够将 MySQL 中的多行数据转为多列数据。如果使用 PIVOT 正常情况下需要使用第一种方法自己手动构造查询,如果有更高级需求如 CUBE ROLLUP 等只有 Pivot 才能支持,需要考虑换用非开源数据库操作(如Oracle、SQL Server等)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL中concat()、concat_ws()、group_concat()函数
返回值: 结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
一觉睡到小时候
2022/11/16
4.7K0
MySQL-多行转多列
在上述语句中,我们使用了条件聚合和CASE表达式。首先使用GROUP BY a将数据按照"a"列进行分组。然后,使用CASE表达式在每个分组内根据"b"列的值进行条件判断,并提取相应的"c"列的值。最后,使用MAX函数进行聚合,获取每个分组内满足条件的最大值(即对应的"c"列的值)。这样就可以实现多行转多列的效果。
火之高兴
2024/07/25
6550
MySQL-多行转多列
MySQL多表联合查询
例 2:查询 tb_course 表中的 id 字段和 tb_students_info 表中的 course_id 字段相等的内容
Alone-林
2022/08/20
11.1K0
数据分析sql面试必会6题经典_数据分析师SQL面试必备50题[通俗易懂]
以下是SQL面试必备的经典的50道题目,每道题都有博主本人的解题思路和对应的SQL语句。
全栈程序员站长
2022/09/07
1.6K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
行列转换包括以下六种情况:(1)列转行。(2)行转列。(3)多列转换成字符串。(4)多行转换成字符串。(5)字符串转换成多列。(6)字符串转换成多行。其中,重点是行转列和字符串转换成多行。
AiDBA宝典
2019/09/29
1.8K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
BI开发过程中的数据处理(Doris)
https://doris.apache.org/zh-CN/docs/dev/get-starting/what-is-apache-doris/
码客说
2023/10/08
1.4K0
BI开发过程中的数据处理(Doris)
MySQL经典50题:面试必备
标题 MySQL经典50题解析及答案 作者 Peter 微信 756803877 公众号 尤而小屋 时间 2021-09-02 MySQL经典50题解析及答案 下面是网传经典的MySQL50题的习题及参考答案💪,供参考和学习,有更好的方法或者不恰当的地方,欢迎提出来 <!--MORE--> 题目1 题目要求 查询"01"课程比"02"课程成绩高的学生的信息及课程分数 SQL实现 -- 方法1 select a.* ,b.s_score as 1_score ,c.s_score
皮大大
2021/09/02
2K0
MySQL经典50题:面试必备
学生成绩管理系统数据库设计–MySQL/SQL Server[通俗易懂]
SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database)
全栈程序员站长
2022/08/31
9.4K0
MySQL系列(2)——聚合函数查询
现在只需要查询avg(score)>84分的结果出来(可以在末尾加上having avg(score)>84);
程序员的时光001
2020/07/14
1.8K0
MySQL系列(2)——聚合函数查询
平平无奇SQL面试题:经典50例
组函数: 去重 distinct() 统计总数sum() 计算个数count() 平均数avg() 最大值max() 最小数min()
大数据真好玩
2021/07/07
2.8K0
hive sql语句和mysql用法区别存档
mysql和hive版本: mysql版本:5.6.17 hive版本:2.1.1
全栈程序员站长
2022/11/11
2.2K0
hive sql语句和mysql用法区别存档
MySQL50-5-第11-15题
自己的方法一开始在课程的最大数中没有使用Course表,导致多使用了一个临时表的结果,现在改成使用Course表的统计值(3)作为课程的总数:
皮大大
2021/03/01
7460
MySQL50-5-第11-15题
MySQL50-9-第31-35题
查询每门课程的平均成绩,结果按平均成绩降序排列;平均成绩相同时,按课程编号c_id升序排列
皮大大
2021/03/01
3620
MySQL50-9-第31-35题
MySQL一行变多行,多行变一行
CBeann
2023/12/25
7540
MySQL一行变多行,多行变一行
MySQL 常用函数
本文介绍一些常用的 MySQL 内置函数,更多更详细的函数介绍请参阅官方文档 Functions and Operators。
恋喵大鲤鱼
2023/10/12
3580
SQL必知必会:刷题笔记
编写一个 SQL 删除语句 来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
陈大剩博客
2023/07/09
4560
SQL必知必会:刷题笔记
收藏|我的Mysql学习笔记
SQL是一个存活近半个世纪的语言,如今仍有大量人在使用。它语法简单,对培养数据整理和提取的思维有很大帮助。我将我过去的笔记分享给大家,希望能为大家的学习提供参考,更希望有人因此能迈出学习SQL的第一步~
刘早起
2020/05/13
1.3K0
收藏|我的Mysql学习笔记
SQL中进行转列的几种方式
在很多笔试的程序员中会有很多写SQL的情况,其中很多时候会考察行转列。那么这个时候如果能写出来几种行转列的SQL,会给面试官留下比较好的印象。
海仔
2019/08/06
2.9K0
SQL中进行转列的几种方式
6. SQL 多表查询
表的生成参考《 3. SQL–数据库基础查询操作》。 前几节所总结的查询,都是基于单张表格进行的,如果单张表格的信息不足以达到查询的目的,就需要将他们组合到一起形成多张表格。
全栈程序员站长
2022/08/23
8990
6. SQL 多表查询
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
InnoDB类型数据表只有一个*. frm文件,以及上一级目录的ibdata1文件 MylSAM类型数据表对应三个文件:
全栈程序员站长
2022/07/02
9430
半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
推荐阅读
相关推荐
MySQL中concat()、concat_ws()、group_concat()函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验