资源描述:
《Oracle一个典型行列转换的几种实现方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、2014年3月17日»Oracle一个典型行列转换的几种实现方法江边潮未尽,枫红一季秋--NinGoo'sblog首页留言本关于归档PostsComments江边潮未尽,枫红一季秋NinGoo'sblogSearch:Go技术杂记旅行生活工具数据←2008中国ORACLE数据库精英工程师评选Feedsky数据异常→Oracle一个典型行列转换的几种实现方法2008年03月30日byNinGoo10Comments假如有如下表,其中各个i值对应的行数是不定的SQL>select*fromt;IAD———-———-——
2、————-1b2008-03-2710:55:42http://www.ningoo.net/html/2008/how_to_do_string_aggregate_on_oracle.html1/112014年3月17日»Oracle一个典型行列转换的几种实现方法江边潮未尽,枫红一季秋--NinGoo'sblog1a2008-03-2710:55:461d2008-03-2710:55:302z2008-03-2710:55:552t2008-03-2710:55:59要获得如下结果,注意字符串需要按照D列的时
3、间排序:1d,b,a2z,t这是一个比较典型的行列转换,有好几种实现方法1.自定义函数实现createorreplacefunctionmy_concat(nnumber)returnvarchar2istypetyp_cursorisrefcursor;v_cursortyp_cursor;v_tempvarchar2(10);v_resultvarchar2(4000):=”;v_sqlvarchar2(200);beginv_sql:=‘selectafromtwherei=’
4、
5、n
6、
7、’orderbyd’;
8、openv_cursorforv_sql;loopfetchv_cursorintov_temp;exitwhenv_cursor%notfound;v_result:=v_result
9、
10、’,’
11、
12、v_temp;endloop;returnsubstr(v_result,2);end;SQL>selecti,my_concat(i)fromtgroupbyi;IMY_CONCAT(I)———-——————–http://www.ningoo.net/html/2008/how_to_do_string_aggre
13、gate_on_oracle.html2/112014年3月17日»Oracle一个典型行列转换的几种实现方法江边潮未尽,枫红一季秋--NinGoo'sblog1d,b,a2z,t虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。2.使用sys_connect_by_pathselecti,ltrim(max(sys_connect_by_path(a,’,')),’,')afrom(selecti,a,
14、d,min(d)over(partitionbyi)d_min,(row_number()over(orderbyi,d))+(dense_rank()over(orderbyi))numidfromt)startwithd=d_minconnectbynumid-1=priornumidgroupbyi;从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:3.使用wm_sys.wm_concat这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据
15、另外一列排序,所以需要先通过子查询或者临时表排好序http://www.ningoo.net/html/2008/how_to_do_string_aggregate_on_oracle.html3/112014年3月17日»Oracle一个典型行列转换的几种实现方法江边潮未尽,枫红一季秋--NinGoo'sblogSQL>selecti,wmsys.wm_concat(a)fromtgroupbyi;IWMSYS.WM_CONCAT(A)———-——————–1b,a,d2z,tSQL>selecti,wmsys
16、.wm_concat(a)2from3(select*fromtorderbyi,d)4groupbyi;IWMSYS.WM_CONCAT(A)———-——————–1d,b,a2z,t执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。不知道大家还有没有更加高效的实现方式,欢迎指教^_^其他一些方法,可以参考