在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;

说明:

  1. CASE WHEN语句根据course字段的值,将对应的score值放到不同的列中
  2. MAX()聚合函数用于消除NULL值,只保留有效的分数值
  3. 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语句。