如何用SQL将多行数据合并为一行,实现查询结果行转列
将用户科目分数从多行转成一行多列的SQL实现
需求场景
你有如下行式存储的用户科目分数数据:
user_id subject_name marks
1001 maths 67
1001 physics 78
1001 chemistry 87
1002 maths 89
1002 physics 56
1002 chemistry 76
需要转换成每行对应一个用户、各科目分数作为列的结构:
user_id maths physics chemistry
1001 67 78 87
1002 89 56 76
解决方案
方法一:跨数据库通用写法(CASE + GROUP BY)
这个写法适配绝大多数数据库(MySQL、PostgreSQL、SQL Server等),假设原始表名为student_marks:
SELECT user_id, MAX(CASE WHEN subject_name = 'maths' THEN marks END) AS maths, MAX(CASE WHEN subject_name = 'physics' THEN marks END) AS physics, MAX(CASE WHEN subject_name = 'chemistry' THEN marks END) AS chemistry FROM student_marks GROUP BY user_id;
原理:通过CASE表达式匹配每个科目,提取对应分数;再按user_id分组,用MAX(或MIN,因为每个用户每个科目只有一条数据,两者效果一致)把同一用户的各科目分数聚合到一行。
方法二:使用PIVOT函数(适用于SQL Server、Oracle等支持PIVOT的数据库)
如果你的数据库支持PIVOT语法,代码会更简洁:
SELECT user_id, maths, physics, chemistry FROM ( SELECT user_id, subject_name, marks FROM student_marks ) AS source_data PIVOT ( MAX(marks) FOR subject_name IN (maths, physics, chemistry) ) AS pivot_result;
原理:子查询获取原始数据,PIVOT子句指定聚合函数(MAX)、要转成列的字段(subject_name)以及目标列名列表。
注意事项
- 确保
subject_name的拼写统一(比如原始数据里的"pyhsics"是笔误,要改成"physics"才能匹配) - 如果有更多科目,只需在CASE分支或PIVOT的IN列表中添加对应科目即可
内容的提问来源于stack exchange,提问作者Charan Reddy
相关产品推荐
相关产品推荐

