列转行 sql

如表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.名字;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值