龙空技术网

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

编程技术汇 110

前言:

此时朋友们对“oracle多列变一列”都比较讲究,兄弟们都想要分析一些“oracle多列变一列”的相关知识。那么小编也在网上收集了一些对于“oracle多列变一列””的相关资讯,希望小伙伴们能喜欢,我们一起来学习一下吧!

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

下面提供两种实现方法:

方法一:使用 GROUP BY 和 CASE WHEN

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

复制代码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 EnglishFROM     studentGROUP BY     name;

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

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

方法二:使用 GROUP_CONCAT 函数

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

复制代码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 EnglishFROM     studentGROUP BY     name;

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

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

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

总结

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

标签: #oracle多列变一列 #oracle 多行数据合并成一行