在Oracle 11g中,行转列(将多行数据转换为多列展示)是常见的数据转换需求,通常可以使用CASE WHEN
语句结合聚合函数(如MAX()
、SUM()
等)来实现。
以下是一个行转列的示例:
假设我们有一个student_score
表,结构和数据如下:
student_id | course | score |
---|---|---|
1 | 语文 | 85 |
1 | 数学 | 92 |
1 | 英语 | 78 |
2 | 语文 | 90 |
2 | 数学 | 88 |
2 | 英语 | 95 |
现在需要将其转换为:
student_id | 语文 | 数学 | 英语 |
---|---|---|---|
1 | 85 | 92 | 78 |
2 | 90 | 88 | 95 |
可以使用如下SQL实现:
SELECT student_id,MAX(CASE WHEN course = '语文' THEN score END) AS "语文",MAX(CASE WHEN course = '数学' THEN score END) AS "数学",MAX(CASE WHEN course = '英语' THEN score END) AS "英语"
FROM student_score
GROUP BY student_id
ORDER BY student_id;
说明:
CASE WHEN
语句根据course
字段的值,将对应的score
值放到不同的列中MAX()
聚合函数用于消除NULL
值,只保留有效的分数值GROUP BY student_id
确保每个学生只显示一行数据
如果课程名称不固定或较多,可以考虑使用Oracle的PIVOT
函数(Oracle 11g及以上版本支持):
SELECT *
FROM (SELECT student_id, course, scoreFROM student_score
)
PIVOT (MAX(score) FOR course IN ('语文' AS "语文", '数学' AS "数学", '英语' AS "英语")
)
ORDER BY student_id;
PIVOT
函数的语法更简洁,但需要明确指定要转换的列值。如果需要动态处理不固定的列值,可能需要使用PL/SQL动态生成SQL语句。