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