ORACLE行转列通用过程
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。
参数:
tabname 需要进行行转列操作的表名;
group_col 查询结果要按某列或某些列分组的字段名;
column_col 要从行转成列的字段;
value_col 需要聚合的值字段;
Aggregate_func 选用的聚合函数,可选,默认为max;
colorder 行转列后列的排序,可选;
roworder 行转列后记录的排序,可选;
when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
viewname 创建的视图名称,可选,默认为v_tmp。