Oracle行列互换 横表和纵表相互转换

/*   
在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换.   
比如有如下数据:   
ID NAME       KECHENG              CHENGJI   
-- ---------- -------------------- -------   
1  a          语文                 80        
2  a          数学                 70        
3  b          语文                 40        
4  b          数学                 100       
5  c          语文                 90        
6  c          数学                 92   
那末我要求显示的结果是:   
NAME       YUWEN                  SHUXUE                   
---------- ---------------------- ----------------------   
a          80                     70      
也就是说把课程这一列放到行上显示.把成绩按照课程分配到相对应的行.   
我只介绍2中简单易用的方法,使用游标或者建立临时表的方法就不介绍了.效率很慢,不易理解.   
首先建立表:   
*/    
    
create table fzq    
(    
id varchar(2),    
name varchar(10),    
kecheng varchar(20),    
chengji varchar(3)    
);    
    
    
--插入数据:    
INSERT INTO fzq VALUES ('1','a','yuwen','80');    
INSERT INTO fzq VALUES('2','a','shuxue','70');    
INSERT INTO fzq VALUES ('3','b','yuwen','40');    
INSERT INTO fzq VALUES ('4','b','shuxue','100');    
INSERT INTO fzq VALUES ('5','c','yuwen','90');    
INSERT INTO fzq VALUES ('6','c','shuxue','92');      
    
/*首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.*/    
    
SELECT NAME,SUM(yuwen) yuwen,SUM(shuxue) shuxue FROM    
(    
SELECT NAME,chengji yuwen,'0' shuxue FROM fzq    
WHERE kecheng='yuwen' UNION    
SELECT NAME,'0' yuwen,chengji  shuxue    
FROM fzq    
WHERE kecheng='shuxue'    
) aaa    
GROUP BY NAME;   
    
/*执行结果:   
NAME       YUWEN                  SHUXUE                   
---------- ---------------------- ----------------------   
a          80                     70                       
b          40                     100                      
c          90                     92   
*/    
/*   
其次是用case.这种方法代码比较短.适合列值很多的情况.   
*/    
    
select name, sum(case kecheng when 'yuwen' then chengji end) yuwen,    
             sum(case kecheng  when 'shuxue' then chengji  end) shuxue    
from fzq    
group by name;    
    
/*执行结果:   
NAME       YUWEN                  SHUXUE                   
---------- ---------------------- ----------------------   
a          80                     70                       
b          40                     100                      
c          90                     92   
所有例子在oracle中测试,sql server没有测试,请根据实际情况修改   
   
如果有更好的方法,欢迎交流.   
*/  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值