ORACLE列拼接成行,且拼接成的行内的各项值需要排序

当时看到这个拼接的时候,第一时间想到的就是wmsys.wm_concat函数,不过就带来一个问题,里面的数据并没有按照想要的形式显示出来。

create table test3
( pname varchar2(5),
  pvalue varchar2(5),
  pdf    varchar2(5),
  receipt    varchar(5)

) ;--纯属测试数据,请忽略细节,随便建的一张表嘿嘿~~

  A AA AAA 111

B BB BBB new
C CC CCC 222
D DD DDD 444
A AA AAA new
A AA AAA 444
A AA AAA 333

然后我想要的结果是这样的:
A AA AAA 111;333;444;new
D DD DDD 444
C CC CCC 222
B BB BBB new

我首先使用的是wmsys.wm_concat函数,SQL如下:

 SELECT PNAME, PVALUE, PDF, WMSYS.WM_CONCAT(RECEIPT)

  FROM (SELECT PNAME,
               PVALUE,
               PDF,
               ROW_NUMBER() OVER(PARTITION BY PNAME, PVALUE, PDF ORDER BY RECEIPT) ROWNU,
               RECEIPT
          FROM TEST3)
 GROUP BY PNAME, PVALUE, PDF

结果不是我想要的

1 A AA AAA 111,new,444,333
2 B BB BBB new
3 C CC CCC 222
4 D DD DDD 444
我换另一种写法:
SELECT PNAME,
       PVALUE,
       PDF,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(RECEIPT, ';')), ';') AS VV
  FROM (SELECT PNAME,
               PVALUE,
               PDF,
               RECEIPT,
               RNFIRST,
               LEAD(RNFIRST) OVER(PARTITION BY PNAME, PVALUE, PDF ORDER BY RNFIRST DESC) RNNEXT
          FROM (SELECT PNAME,
                       PVALUE,
                       PDF,
                       RECEIPT,
                       ROW_NUMBER() OVER(ORDER BY RECEIPT) RNFIRST
                  FROM TEST3) TMPTAB1) TMPTAB2
 START WITH RNNEXT IS NULL
CONNECT BY RNNEXT = PRIOR RNFIRST
 GROUP BY PNAME, PVALUE, PDF

得到我想要的结果了 

1 A AA AAA 111;333;444;new
2 D DD DDD 444
3 C CC CCC 222
4 B BB BBB new

再来,就是下班前,一个大哥提醒,说其实用第一种方法,在拼接的时候调函数,函数传入三个需要分组的参数做为值,进去表里查出多条记录,通过游标遍历组成一个字符串,这样也可实现我们想要的效果。嘿嘿,SQL写法太多,还需要继续学习,加油努力,嘻嘻~~ 

 

 

 

转载于:https://www.cnblogs.com/medci/archive/2012/10/24/ORACLE%e5%88%97%e6%8b%bc%e6%8e%a5%e6%88%90%e8%a1%8c%e5%b9%b6%e6%8e%92%e5%ba%8f.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值