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