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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:35:29