oracle的列转行问题

Oracle的列转行问题

Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题。

网络上流传了很多将行数据转换称列数据的方法和应用实例,一般通过decode或者case函数与聚合函数联合实现功能,这里就不再重复。

日前本人在一个偶然的应用中用到了一个需要将列数据转换为行数据的问题。搜索了很久没有发现很合适的方法。网络一般推荐使用union all实现。这样的一个重要问题在于会造成对数据表的重复访问,性能是个重要问题。

基于此,作者设想了另外一种实现可能性。实践证明,这种方法有效提供了查询性能。

 

create table f_distribution(

f1 varchar2(200),

qty1 int,

qty2 int,

qty3 int

);

 

 

 

insert into f_distribution(f1,qty1,qty2,qty3) values('zhanglei',1,2,3);

insert into f_distribution(f1,qty1,qty2,qty3) values('lixian',1,2,3);

insert into f_distribution(f1,qty1,qty2,qty3) values('zhoubin',1,2,3);

insert into f_distribution(f1,qty1,qty2,qty3) values('zhengtong',1,2,3);

 

select * from f_distribution

 

 

select a.f1,b.fid,

  decode(b.fid,'数据1',a.qty1,

               '数据2',a.qty2,

               '数据3',a.qty3

               )

from f_distribution a,

(

  select '数据1' fid from dual

  union all

  select '数据2' fid from dual

  union all

  select '数据3' fid from dual 

  ) b

你可能感兴趣的:(oracle,网络,table,insert)