如何用MySQL将多行字段转换为多列展示?
MySQL行转列查询:无唯一标识列的场景转换
问题描述
原始数据表结构及数据如下:
| Roll No | Semester | Sub_code | Sub_name | Sub_grade |
|---|---|---|---|---|
| 19hhh01 | 1 | BSL 001 | AI | B+ |
| 19hhh01 | 1 | CSL 2022 | OS | C+ |
| 19hhh01 | 2 | IUJ 1022 | DDS | A+ |
| 19hhh01 | 2 | KSJ 2012 | KJ | C+ |
| 19hhh02 | 1 | BSL 001 | AI | B+ |
| 19hhh02 | 1 | CSL 2022 | OS | A+ |
| 19hhh02 | 2 | IUJ 1022 | DDS | A+ |
| 19hhh02 | 2 | KSJ 2012 | KJ | A+ |
需要将上述数据转换为以下格式:
| Roll No | Semester | Sub_code1 | Sub_name1 | Sub_grade1 | Sub_code2 | Sub_name2 | Sub_grade2 |
|---|---|---|---|---|---|---|---|
| 19hhh01 | 1 | BSL 001 | AI | B+ | CSL 2022 | OS | C+ |
| 19hhh01 | 2 | IUJ 1022 | DDS | A+ | KSJ 2012 | KJ | C+ |
| 19hhh02 | 1 | BSL 001 | AI | B+ | CSL 2022 | OS | A+ |
| 19hhh02 | 2 | IUJ 1022 | DDS | A+ | KSJ 2012 | KJ | A+ |
注意:该场景不存在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;
代码说明
- 子查询生成序号:使用
ROW_NUMBER()窗口函数,按Roll No和Semester分组,为每个分组内的课程生成唯一序号rn,这里按Sub_code排序确保序号的稳定性; - 外层条件聚合:通过
MAX(CASE...)的方式,将每个分组内序号为1和2的课程信息分别映射到对应的目标列中; - 替换表名:将语句中的
your_table_name替换为你实际的数据表名称即可执行。
内容的提问来源于stack exchange,提问作者Mohit Verma
相关产品推荐
相关产品推荐

