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写法太多,还需要继续学习,加油努力,嘻嘻~~ 

 

 

 

posted @ 2012-10-24 23:18 medci(卡樂江) 阅读(...) 评论(...) 编辑 收藏