You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MySQL将多行字段转换为多列展示?

MySQL行转列查询:无唯一标识列的场景转换

问题描述

原始数据表结构及数据如下:

Roll NoSemesterSub_codeSub_nameSub_grade
19hhh011BSL 001AIB+
19hhh011CSL 2022OSC+
19hhh012IUJ 1022DDSA+
19hhh012KSJ 2012KJC+
19hhh021BSL 001AIB+
19hhh021CSL 2022OSA+
19hhh022IUJ 1022DDSA+
19hhh022KSJ 2012KJA+

需要将上述数据转换为以下格式:

Roll NoSemesterSub_code1Sub_name1Sub_grade1Sub_code2Sub_name2Sub_grade2
19hhh011BSL 001AIB+CSL 2022OSC+
19hhh012IUJ 1022DDSA+KSJ 2012KJC+
19hhh021BSL 001AIB+CSL 2022OSA+
19hhh022IUJ 1022DDSA+KSJ 2012KJA+

注意:该场景不存在id+fieldname类的唯一标识列,需针对此情况实现转换。

解决方案

可以通过窗口函数生成分组内序号+条件聚合的方式实现转换,对应的MySQL查询语句如下:

SELECT
    `Roll No`,
    Semester,
    MAX(CASE WHEN rn = 1 THEN Sub_code END) AS Sub_code1,
    MAX(CASE WHEN rn = 1 THEN Sub_name END) AS Sub_name1,
    MAX(CASE WHEN rn = 1 THEN Sub_grade END) AS Sub_grade1,
    MAX(CASE WHEN rn = 2 THEN Sub_code END) AS Sub_code2,
    MAX(CASE WHEN rn = 2 THEN Sub_name END) AS Sub_name2,
    MAX(CASE WHEN rn = 2 THEN Sub_grade END) AS Sub_grade2
FROM (
    SELECT
        `Roll No`,
        Semester,
        Sub_code,
        Sub_name,
        Sub_grade,
        ROW_NUMBER() OVER (PARTITION BY `Roll No`, Semester ORDER BY Sub_code) AS rn
    FROM your_table_name
) AS ranked
GROUP BY `Roll No`, Semester
ORDER BY `Roll No`, Semester;

代码说明

  1. 子查询生成序号:使用ROW_NUMBER()窗口函数,按Roll No和Semester分组,为每个分组内的课程生成唯一序号rn,这里按Sub_code排序确保序号的稳定性;
  2. 外层条件聚合:通过MAX(CASE...)的方式,将每个分组内序号为1和2的课程信息分别映射到对应的目标列中;
  3. 替换表名:将语句中的your_table_name替换为你实际的数据表名称即可执行。

内容的提问来源于stack exchange,提问作者Mohit Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:17:03