ORACLE行转列通用过程(转)
1.使用视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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。
举例:
1
2
3
4
5
6
7
8
9
10
11
|
--测试数据 create table rowtocol_test as select 2009 year ,1 month , '部门1' dept,50000 expenditure from dual union all select 2009,2, '部门1' ,20000 from dual union all select 2009,2, '部门1' ,30000 from dual union all select 2010,1, '部门1' ,35000 from dual union all select 2009,2, '部门2' ,40000 from dual union all select 2009,3, '部门2' ,25000 from dual union all select 2010,2, '部门3' ,60000 from dual union all select 2009,2, '部门3' ,15000 from dual union all select 2009,2, '部门3' ,10000 from dual; |
我现在想根据year和month分组,将部门转成列。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
SQL> select * from rowtocol_test; YEAR MONTH DEPT EXPENDITURE ---------- ---------- ----- ----------- 2009 1 部门1 50000 2009 2 部门1 20000 2009 2 部门1 30000 2010 1 部门1 35000 2009 2 部门2 40000 2009 3 部门2 25000 2010 2 部门3 60000 2009 2 部门3 15000 2009 2 部门3 10000 9 rows selected SQL> execute row_to_col( 'rowtocol_test' , 'year,month' , 'dept' , 'expenditure' ); PL/SQL procedure successfully completed SQL> select * from v_tmp; YEAR MONTH 部门1 部门3 部门2 ---------- ---------- ---------- ---------- ---------- 2009 1 50000 2010 1 35000 2009 3 25000 2009 2 30000 15000 40000 2010 2 60000 SQL> |
这个结果可能不是我们想要的,重新调用过程,使用几个可选参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SQL> execute row_to_col( 'rowtocol_test' , 'year,month' , 'dept' , 'expenditure' ,Aggregate_func => 'sum' ,colorder => 'dept' ,roworder => '1,2' ,when_value_null => '0' ); PL/SQL procedure successfully completed SQL> select * from v_tmp; YEAR MONTH 部门1 部门2 部门3 ---------- ---------- ---------- ---------- ---------- 2009 1 50000 0 0 2009 2 50000 40000 25000 2009 3 0 25000 0 2010 1 35000 0 0 2010 2 0 0 60000 SQL> |
进行行转列的也可以是视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL> create view view_rowtocol as select * from rowtocol_test where year =2009; View created SQL> execute row_to_col( 'view_rowtocol' , 'year,month' , 'dept' , 'expenditure' ,Aggregate_func => 'sum' ,colorder => 'dept' ,roworder => '1,2' ,when_value_null => '0' ); PL/SQL procedure successfully completed SQL> select * from v_tmp; YEAR MONTH 部门1 部门2 部门3 ---------- ---------- ---------- ---------- ---------- 2009 1 50000 0 0 2009 2 50000 40000 25000 2009 3 0 25000 0 SQL> |
-----------------------------------------------------------
2.稍加修改,使用函数,返回游标。或利用过程里的传出参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
create or replace function row_to_col_func(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 ) return sys_refcursor Authid Current_User as sqlstr varchar2(2000):= 'select ' ||group_col|| ' ' ; c1 sys_refcursor; v1 varchar2(100); cur sys_refcursor; 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; open cur for sqlstr|| ' from ' ||tabname|| ' group by ' ||group_col|| case when roworder is not null then ' order by ' ||roworder end ; return cur; end row_to_col_func; |
在pl/sql dev中可以在sql窗口执行,查看结果
1
2
3
4
5
6
7
8
9
10
11
12
13
|
select row_to_col_func( 'rowtocol_test' , 'year,month' , 'dept' , 'expenditure' ,Aggregate_func => 'sum' ,colorder => 'dept' ,roworder => '1,2' ,when_value_null => '0' ) from dual; ROW_TO_COL_FUNC('ROWTOCOL_TEST < Cursor > YEAR MONTH 部门1 部门2 部门3 2009 1 50000 0 0 2009 2 50000 40000 25000 2009 3 0 25000 0 2010 1 35000 0 0 2010 2 0 0 60000 |
原文:http://bbs.csdn.net/topics/330039676
ORACLE行转列通用过程(转)的更多相关文章
- ORACLE行转列通用过程
create or replace procedure row_to_col(tabname in varchar2, group_ ...
- oracle 行转列 分析函数
oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...
- ORACLE 行转列的通用过程
--测试数据create table rowtocol_test asselect 2009 year,1 month,'部门1' dept,50000 expenditure from dualun ...
- Oracle 行转列 动态出转换的列
本文链接:https://blog.csdn.net/Huay_Li/article/details/82924443 10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后, ...
- oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式
转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...
- Oracle行转列LISTAGG函数
工作过程中需要将查询的数据分组并显示在一行.以往的工作经验,在sql server中可以用for xml path来实现. 现提供Oracle数据库的行转列方式 oracle11g官方文档简介如下: ...
- Oracle行转列、列转行的Sql语句总结
多行转字符串 这个比较简单,用||或concat函数可以实现 SQL Code 12 select concat(id,username) str from app_userselect i ...
- Oracle行转列、列转行的Sql语句总结(转)
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...
随机推荐
- 1080 Graduate Admission (30)(30 分)
It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...
- Data Guard 异构平台支持手册
背景 最简单的DG 环境是同数据库版本,同操作系统平台. 但有时需要在异构平台上来部署DG 环境,比如异构下使用DG 来进行数据迁移,从而降低停机时间和风险等等. 1. 查看主备库的Platform ...
- UGUI笔记
Text中的可以单独指定某些文字的颜色,只需将想要变色的文本放在<color=**></color>之间即可,如“吃<color=#ff7a38>橙色物品</ ...
- qt5.3+vs2013乱码
解决qt5.3+vs2013乱码,在main函数之前加入 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8&quo ...
- c++控制台 设置字体颜色
一种方法是直接在程序上方栏杆点右键,然后属性处设置 优点是设置后一劳永逸,不需要像后面方法那样要自己把设置写入程序代码内 缺点是,一旦设置了就不能再改变了,程序从头到尾都是那种设置. 第二种方法是使用 ...
- Vector源码剖析
参考:http://blog.csdn.net/ns_code/article/details/35793865
- JavaWeb_打包web应用war
使用下面的语句进行打包 jar -cvf aa.war news 打包之后的文件可以直接放在tomcat的webapps里面,一旦启动tomcat,会自动解压aa.war文件.
- jquery、javascript实现(get、post两种方式)跨域解决方法
一.实现get方式跨域请求数据 浏览器端 <script> $(document).ready(function(){ $.ajax({ url: "http://www.xxx ...
- 洛谷P3382 【模板】三分法(三分找凹凸点)
P3382 [模板]三分法 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个 ...
- Linux 基础命令(一)
Linux 基础: https://www.cnblogs.com/linhaifeng/articles/6045600.html Linux 比 Windows 更稳定做服务器,开发出来的软件需要 ...