在 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 English
FROM
student
GROUP BY
name;
这条 SQL 语句执行的步骤是:
方法二:使用 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 English
FROM
student
GROUP BY
name;
这条 SQL 语句执行的步骤是:
需要注意的是,GROUP_CONCAT() 函数会有长度限制,要转化的字符数量过多可能引起溢出错误。
总结
以上两种实现方法都能够将 MySQL 中的多行数据转为多列数据。如果使用 PIVOT 正常情况下需要使用第一种方法自己手动构造查询,如果有更高级需求如 CUBE ROLLUP 等只有 Pivot 才能支持,需要考虑换用非开源数据库操作(如Oracle、SQL Server等)。