在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语句。