- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Oracle一个典型行列转换的几种实现方法
2014年3月17 日 » Oracle一个典型行列转换的几种实现方法 江边潮未尽,枫红一季秋 -- NinGoos blog
首页
留言本
关于
归档
Posts Comments
江边潮未尽,枫红一季秋
NinGoos blog
Search: Go
技术
杂记
旅行
生活
工具
数据
← 2008中国ORACLE数据库精英工程师评选
Feedsky数据异常 →
Oracle一个典型行列转换的几种实现方法
2008年03月30日 by NinGoo 10 Comments
假如有如下表,其中各个i值对应的行数是不定的
SQL select * from t;
I A D
———- ———- ——————-
1 b 2008-03-27 10:55:42
/html/2008/how_to_do_string_agg regate_on_oracle.html 1/11
2014年3月17 日 » Oracle一个典型行列转换的几种实现方法 江边潮未尽,枫红一季秋 -- NinGoos blog
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59
要获得如下结果,注意字符串需要按照D列的时间排序:
1 d,b,a
2 z,t
这是一个比较典型的行列转换,有好几种实现方法
1. 自定义函数实现
create or replace function my_concat(n number)
return varchar2
is
type typ_cursor is ref cursor ;
v_cursor typ_cursor ;
v_temp varchar2(10);
v_result varchar2(4000): ”;
v_sql varchar2(200);
begin
v_sql : ‘select a from t where i ’ || n ||’ order by d’;
open v_cursor for v_sql;
loop
fetch v_cursor into v_temp ;
exit when v_cursor%notfound;
v_result : v_result ||’,’ || v_temp ;
end loop ;
return substr (v_result,2);
end;
SQL select i,my_concat(i) from t group by i;
I MY_CONCAT (I)
———- —————— –
/html/2008/how_to_do_string_agg regate_on_oracle.html 2/11
2014年3月17 日 » Oracle一个典型行列转换的几种实现方法 江边潮未尽,枫红一季秋 -- NinGoos blog
1 d,b,a
2 z,t
虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的
次数和i的值成正比,性能会非常差。
2.使用sys_connect_by_path
select i,ltrim (max (sys_connect_by_path (a,’,)),’,) a
from
(
select i,a,d,min (d) over (partition by i) d_min,
(row_number () over (order by i,d))+ (dense_rank () over (order by i)) num
文档评论(0)