使用wm_cancat解决串连接的顺序问题

同事想将公式表中的竖着存储的几条公式全部连接到一个串中,使用wm_cancat 函数一条语句就能实现,响应速度也很快。但是随后的问题来了,虽然可以把一个指标的公式都连接到一个串中,但是公式的顺序不能保证正确。

select zb_lsm,zt_lsm,wm_concat(zb)

from t1

where tsbs='1'

group by zb_lsm,zt_lsm;

结果为:(其中公式的各项用逗号分开)

1              0023        zt0284     60005085E0605200005471012101,1000,*

2              0039        zt0284     60007065E0605200016101012101,1000,*

3              0051        zt0284     60005085E0605200005411012101,1000,*

4              0115        GS036     jjzb000170,jjzb000170,/

5              0115        GS037     nhzb935,10000,*

6              0115        GS038     nhzb949,10000,*

7              cz0005     ZZ00       40000411,10000,/

8              cz0009     ZZ00       (,10000,/,),60010237D060520000962,+,60002000D060520000172

 

SELECT zb_lsm,zt_lsm, MAX(LTRIM(SYS_CONNECT_BY_PATH(xh||'-'||zb, ','), ',')) zb

 FROM

 (

 SELECT zb_lsm,zt_lsm,xh,zb, ROW_NUMBER() OVER (PARTITION BY zb_lsm ORDER BY zb_lsm,zt_lsm,xh) RN

 FROM t1 --

 where --zb_lsm='11002460' and zt_lsm='cz061' and

 tsbs='1'

 )

 START WITH RN = 1

 CONNECT BY PRIOR RN + 1 = RN

 AND PRIOR zb_lsm = zb_lsm and zt_lsm=zt_lsm

 GROUP BY zb_lsm,zt_lsm;

--(其中公式的各项前面添加了相应的序号,用逗号分开)

但是这个语句响应速度相应比较慢,数据量大了还会出现ora_01489 字符串连接结果过长。

   经过查找,还真有不少人问这个问题,综合一下,解决方法如下:一种更改方法,更改wm_concat的定义方法,另外一种方法就是使用别的方法。最后改写下语句如下,28万条语句也能几秒出结果:

----最终语句  OK 28万条语句也能几秒出结果  ---

with test as(

select zb_lsm ,zt_lsm  ,zb value,xh,tsbs

             --,ROW_NUMBER() OVER(PARTITION BY zb_lsm,zt_lsm ORDER BY xh) RN

              from t1

              where --zb_lsm in ('0200000003') and zt_lsm in ('A031300001','A031300015') and

              tsbs='1'

              -- and rownum<100

              order by zb_lsm,zt_lsm,xh )

select zb_lsm,zt_lsm,value from (

select zb_lsm,zt_lsm, 

  WMSYS.WM_CONCAT(xh||'--'||value) OVER(PARTITION BY zb_lsm,zt_lsm ORDER BY xh) value

  ,row_number() over(PARTITION BY zb_lsm,zt_lsm ORDER BY xh desc) rs 

 from test --group by zb_lsm,zt_lsm

 )

--order by rs

  where rs=1

--(其中公式的各项前面添加了相应的序号,用逗号分开)

 

输出结果:

1              0023        zt0284     1--60005085E0605200005471012101,2--*,3--1000

2              0039        zt0284     1--60007065E0605200016101012101,2--*,3--1000

3              0051        zt0284     1--60005085E0605200005411012101,2--*,3--1000

4              0115        GS036     1--jjzb000170,2--/,3--jjzb000170

5              0115        GS037     1--nhzb935,2--*,3--10000

6              0115        GS038     1--nhzb949,2--*,3--10000

7              01zztrcc0301101210101         GS216     1--01zztrcc0301101210101,1--01zztrcc0301101210101

8              01zztrcc0301101210101         GS217     1--01zztrcc0301101210101,1--01zztrcc0301101210101

9              01zztrcc0301101210101         GS218     1--01zztrcc0301101210101,1--01zztrcc0301101210101

10            01zztrcc0301101210101         hyphb5    1--01zztrcc0301101210101

11            01zztrcc0401101210101         GS216     1--01zztrcc0401101210101,1--01zztrcc0401101210101

12            01zztrcc0401101210101         GS217     1--01zztrcc0401101210101,1--01zztrcc0401101210101

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7177735/viewspace-746715/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7177735/viewspace-746715/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值