oracle行转列通用过程(转)
环境oracle 10g
工作关系,常做些行转列报表,报表通常不是在大数据集合上处理.
所以写了个过程.
本过程比较适合在于需要动态输出报表的地方,例如web中.
不是很完美,但已经可以解决绝大部分的问题.
create or replace function func_RowToCol(
viewName Varchar2,
grpCols Varchar2,
colCol Varchar2,
valueCol Varchar2,
fillEmptyWithZero Number:=1,
rowOrder Varchar2:='',
colOrder Varchar2:='',
rowOrderinGrp Integer:=1,
colOrderStyle Varchar2:=' asc ',
fillValue Varchar2:=''
) return varchar2
Is
/*****************************************************************************************************
名称:func_RowToCol
参数说明:
viewName 视图名称,实际上可以是数据库的表格名称,视图名称,也可以是SQL语句.
grpCols 需要分组的列,以格式 col1,col2..coln传入,其中n是大于0的整数
colCol 由行转为列的那个列
valueCol 行转列后,依然作为值填充的那个列,只能是一个列
--viewIsSql 视图是否是sql语句,如果是则传入1,反之传入2,默认是1(是sql)
fillEmptyWithZero 用0来填充空值,默认空值依然保留空值.如果是1,则只对valueCol为数值类型的有效.
rowOrder 结果默认的排序语句,如果有,则使用这个,这个是对结果的行排序
colOrder 对转成的列进行排序的依据.
rowOrderinGrp 行的排序列是否在分组列(grpcols)中,0 表示不是,1表示是,默认是在分组列中。
colOrderStyle 这个参数说明了列的排序方式
fillValue 填充值,如果非空,且fillEmptyWithZero=1,则用.
举例:有一个表格EmpSalary(SalMonth number,EmpName varchar2(20),salary number) 其中
salMonth,EmpName组成唯一约束
假设有以下数据:
SALMONTH EMPNAME SALARY
---------- -------------------- ----------
200801 lzf 8000
200801 wth 8000
200801 lxl 7000
200801 fjl 8000
200801 wcl 40000
200802 lzf 9000
200802 wth 8000
....
现在需要按照这样的格式输出
salaryMonth lzf wth lxl fjl wcl
200801 8000 8000 7000 8000 40000
200801 9000 8000
那么参数应该这样传递func_RowToCol('empsalary','','salarymonth','empname','salary',0,1);
输出:
如果成功,则返回一个基于tempdata_manycols的查询sql字符串
如果失败,则返回空值.
注意事项:
本函数是基于一个叫tempdata_manyCols