【转】Oracle行列互换

原文:http://xace.javaeye.com/blog/434537

/*  

在实际使用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','语文','80');   
insert into fzq values('2','a','shuxue','70');   
insert into fzq values ('3','b','yuwen','40');   
insert into fzq values ('4','b','shuxu','100');   
insert into fzq values ('5','c','yuwen','90');   
insert into fzq values ('6','c','shuxu','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没有测试,请根据实际情况修改  
 
如果有更好的方法,欢迎交流.  
*/ 

posted on 2009-11-18 16:38  CodingME!  阅读(397)  评论(0编辑  收藏  举报

导航

Blog