Oracle行列互换 横表和纵表
转载http://xace.iteye.com/blog/434537
行列互换
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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');
-
-
-
- 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;
-
-
-
-
-
-
-
-
-
-
-
-
- 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;
-
-
-
-
-
-
-
-
-
-
-
横表和纵表
第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式
第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。
从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。
纵表转横表
- 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;