ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sql 行列互换

sql 行列互换

原创 Linux操作系统 作者:chwang1984 时间:2011-09-19 11:23:16 0 删除 编辑


在实际使用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','数学','70');
insert into fzq
values ('3','b','语文','40');
insert into fzq
values ('4','b','数学','100');
insert into fzq
values ('5','c','语文','90');
insert into fzq
values ('6','c','数学','92');
/*
首先使用union.如果课程这列有多个值,那么脚本的代码就很长了.
*/
select name,sum(yuwen) yuwen,sum(shuxue) shuxue
from
(
select name,chengji yuwen,'0' shuxue
from fzq
where kecheng='语文'
union
select name,'0' yuwen,chengji  shuxue
from fzq
where kecheng='数学'
) aaa
group BY name;
/*执行结果:
NAME       YUWEN                  SHUXUE                
---------- ---------------------- ----------------------
a          80                     70                    
b          40                     100                   
c          90                     92
*/
/*
其次是用case.这种方法代码比较短.适合列值很多的情况.
*/
select name, sum(case kecheng when '语文' then chengji end) yuwen,
             sum(case kecheng  when '数学' then chengji  end) shuxue
from fzq
group by name;
/*执行结果:
NAME       YUWEN                  SHUXUE                
---------- ---------------------- ----------------------
a          80                     70                    
b          40                     100                   
c          90                     92
所有例子在oracle中测试,sql server没有测试,请根据实际情况修改

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17179887/viewspace-707868/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-27

  • 博文量
    96
  • 访问量
    185871