码迷,mamicode.com
首页 > 数据库 > 详细

Oracle行列互换 横表和纵表

时间:2015-11-25 13:09:14      阅读:164      评论:0      收藏: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,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没有测试,请根据实际情况修改

如果有更好的方法,欢迎交流.
*/

 

横表和纵表 

技术分享 

技术分享 

第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式 

第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。 

从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。 

在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。 

纵表转横表 

sql代码:

Select student_no,
        max(decode(field_name,student_name,field_value)) As student_name,
        max(decode(field_name,student_sex,field_value )) As student_sex
    From cuc_student_y Group By student_no;

 

Oracle行列互换 横表和纵表

标签:

原文地址:http://www.cnblogs.com/adolphyang/p/4994291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!