如表ROW2COLUMN2有以下数据:
名字 课程 分数
1 张三 语文 80
2 张三 数学 86
3 张三 英语 75
4 李四 语文 78
5 李四 数学 85
6 李四 英语 78
想变成下面记录:
名字 语文 数学 英语
1 李四 78 85 78
2 张三 80 86 75
代替:
名字 课程 分数
A A1 80
A B1 86
B A1 75
C C1 78
C A1 85
变成 :
名字 A1 B1 C1
A 80 86
B 75
行转成列: -----------------------------------------------
select man, min(decode(课程,'A1',num)) A1,
min(decode(课程,'B1',num)) B1,
min(decode(课程,'C1',num)) C1
from tab group by 名字
另一种方法:
select t1.名字, t1.分数,t2.分数,t3.分数 from Tab t1 inner join Tab t2 on t1.名字=t2.名字
inner join Tab t3 on t1.名字=t3.名字
where t1.课程='A1' and t2.课程='B1' and t3.课程='C1'
方法三:
--这种情况可以用分析函数实现:
SELECT b.名字,
MAX(decode(rn, 1, num, NULL)) cn_1,
MAX(decode(rn, 2, num, NULL)) cn_2,
MAX(decode(rn, 3, num, NULL)) cn_3
FROM (SELECT 名字,分数,
row_number() over(PARTITION BY 名字 ORDER BY 课程) rn
FROM tab) b
GROUP BY b.名字;