首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

典型行转列,请好手赐教,快速散分结贴

2013-07-04 
典型行转列,请高手赐教,快速散分结贴!当前数据:[解决办法]看着 和下午那贴差不多类型 无非是不以值为字段

典型行转列,请高手赐教,快速散分结贴!
当前数据:


[解决办法]
看着 和下午那贴差不多类型 无非是不以值为字段别名

求一个行转列的做法
[解决办法]
create or replace procedure row_to_col(tabname in varchar2,
                                  group_col in varchar2,
                                  column_col in varchar2,
                                  value_col in varchar2,
                                  Aggregate_func in varchar2 default 'max',
                                  colorder in varchar2 default null,


                                  roworder in varchar2 default null,
                                  when_value_null in varchar2 default null,
                                  viewname in varchar2 default 'v_tmp')
Authid Current_User
as
  sqlstr varchar2(2000):='create or replace view '
[解决办法]
viewname
[解决办法]
' as select '
[解决办法]
group_col
[解决办法]
' ';
  c1 sys_refcursor;
  v1 varchar2(100);
begin
  open c1 for 'select distinct '
[解决办法]
column_col
[解决办法]
' from '
[解决办法]
tabname
[解决办法]
case when colorder is not null then ' order by '
[解决办法]
colorder end;
  loop
    fetch c1 into v1;
    exit when c1%notfound;
    sqlstr:=sqlstr
[解决办法]
chr(10)
[解决办法]
','
[解决办法]
case when when_value_null is not null then 'nvl(' end
[解决办法]

      Aggregate_func
[解决办法]
'(decode(to_char('
[解决办法]
column_col
[解决办法]
'),'''
[解决办法]
v1
[解决办法]
''','
[解决办法]
value_col
[解决办法]
'))'
[解决办法]

      case when when_value_null is not null then chr(44) 
------解决方案--------------------


when_value_null
[解决办法]
chr(41) end
[解决办法]
'"'
[解决办法]
v1
[解决办法]
'"';
  end loop;
  close c1;
  sqlstr:=sqlstr
[解决办法]
' from '
[解决办法]
tabname
[解决办法]
' group by '
[解决办法]
group_col
[解决办法]
case when roworder is not null then ' order by '
[解决办法]
roworder end;
  execute immediate sqlstr;
end row_to_col;



这里修改了传入参数名,使其更容易理解。继续使用了创建视图这个方法,当然也可以改成用游标传出。
参数:
tabname 需要进行行转列操作的表名;
group_col 查询结果要按某列或某些列分组的字段名;
column_col 要从行转成列的字段;
value_col 需要聚合的值字段;
Aggregate_func 选用的聚合函数,可选,默认为max;
colorder 行转列后列的排序,可选;
roworder 行转列后记录的排序,可选;
when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
viewname 创建的视图名称,可选,默认为v_tmp。

测试用例可以参考 http://bbs.csdn.net/topics/330039676
[解决办法]
静态行列转换:
select t.aid,
       t.bid,
       t.bname,
       max(decode(t.akey, 1, t.akey, 0)) Akey,
       max(decode(t.akey, 2, t.akey, 0)) Akey,
       max(decode(t.akey, 3, t.akey, 0)) Akey,
       max(decode(t.avalue, 'P1', t.avalue, 0)) AValue,
       max(decode(t.avalue, 'P2', t.avalue, 0)) AValue,
       max(decode(t.avalue, 'P3', t.avalue, 0)) AValue
  from tx t
 group by t.aid, t.bid, t.bname;



按楼主的意思好像是要动态行列转换??那一个sql搞不定的,得写过程。

热点排行