小蒜头's Blog

Happy coding

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

小蒜头 posted @ 2013年4月07日 17:57 in [Oracle数据库] , 880 阅读

当时看到这个拼接的时候,第一时间想到的就是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写法太多,还需要继续学习,加油努力,嘻嘻~~

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter