如何将Oracle数据库指定列的行值转换为列标题?
Oracle 学生成绩行转列查询方案
方案一:使用PIVOT函数(Oracle 11g及以上推荐)
假设你的成绩主表名为STUDENT_SCORES,包含字段:STUDENT_ID(学生ID)、STUDENT_NAME(姓名)、SUBJECT(科目)、SCORE(成绩),可以用PIVOT直接实现行转列:
SELECT * FROM ( SELECT STUDENT_ID, STUDENT_NAME, SUBJECT, SCORE FROM STUDENT_SCORES ) PIVOT ( MAX(SCORE) FOR SUBJECT IN ( '语文' AS 语文, '数学' AS 数学, '英语' AS 英语, '物理' AS 物理 -- 根据实际科目列表补充 ) ) ORDER BY STUDENT_ID;
MAX(SCORE)使用聚合函数是因为每个学生单科目仅一条记录,MAX/AVG/SUM结果一致IN子句需枚举所有要转为列的科目,别名对应目标输出的列名
方案二:使用CASE WHEN + 聚合函数(兼容低版本Oracle)
如果你的Oracle版本低于11g,用传统方法实现:
SELECT STUDENT_ID, STUDENT_NAME, MAX(CASE WHEN SUBJECT = '语文' THEN SCORE END) AS 语文, MAX(CASE WHEN SUBJECT = '数学' THEN SCORE END) AS 数学, MAX(CASE WHEN SUBJECT = '英语' THEN SCORE END) AS 英语, MAX(CASE WHEN SUBJECT = '物理' THEN SCORE END) AS 物理 -- 按需添加科目 FROM STUDENT_SCORES GROUP BY STUDENT_ID, STUDENT_NAME ORDER BY STUDENT_ID;
- 通过CASE WHEN匹配对应科目,聚合函数MAX用于过滤NULL值,确保每个学生每个科目仅显示对应成绩
- GROUP BY按学生ID和姓名分组,保证每行对应一个学生的所有成绩
内容的提问来源于stack exchange,提问作者Hokins
相关产品推荐
相关产品推荐

