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

2023-08-22 16:16:52 浏览数 (1)

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

下面提供两种实现方法:

方法一:使用 GROUP BY 和 CASE WHEN

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

代码语言:javascript复制
复制代码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复制
复制代码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等)。

0 人点赞