Oracle wm concat函式排序的解決方法

2021-10-22 17:53:42 字數 1971 閱讀 7386

預設情況下,使用wm_concat和group by拼接欄位時,拼接的字段順序是無規則的。

建立測試資料:

create table tb(

seq number(10),

remark varchar2(100),

createtime date

);insert into tb(seq, remark, createtime)

select 1, '說明1', to_date('20210101','yyyymmdd') from dual

union all

select 1, '說明2', to_date('20210111','yyyymmdd') from dual

union all

select 1, '說明3', to_date('20210201','yyyymmdd') from dual

union all

select 1, '說明4', to_date('20210208','yyyymmdd') from dual

union all

select 5, '說明5', to_date('20210301','yyyymmdd') from dual

需求:按照建立日期createtime欄位排序,拼接remark欄位。

首先,按照wm_concat和group by查詢,wm_concat拼接後的結果沒有排序。

select seq, wm_concat('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark) remark

from tb

group by seq;

有2種解決方法。方法1:使用wm_concat over(partition by 分組字段 order by 排序字段)後,外面再套max和group by 查詢

select seq, max(remark) remark

from (select seq,

wm_concat('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark) over(partition by seq order by createtime) remark

from tb

)group by seq;

裡面一層

select seq,

wm_concat('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark) over(partition by seq order by createtime) remark

from tb

查詢結果如下:

方法2:

如果是oracle 11g以上版本,使用oracle 11g新增的函式listagg,可以實現按條件列轉行,它有2個引數,第1個引數為需要拼接的字段,第2個引數為分隔符(可選)

select seq,

listagg('[' || to_char(createtime, 'yyyy-mm-dd') || ']' || remark, ',') within group(order by createtime) remark

from tb

group by seq;

oracle wm concat函式的使用

wm concat函式的左右是列轉行 例 u id goods num 1 蘋果 2 2 梨子 5 1 西瓜 4 3 葡萄 1 3 香蕉 1 1 橘子 3 想要的結果為 u id goods sum 1 蘋果,西瓜,橘子 2 梨子 3 葡萄,香蕉 select u id,wmsys.wm conca...

Oracle wm concat()函式 及排序

今天在專案中修改了乙個sql select t.dmid bmid,wm concat m.xm fgld from gg user m,gg dmnr qx t where m.id t.czyid group by dmid 這個函式也夠把符合條件的幾條資料的某一列 合併成一條資料中的某一列 比...

oracle wm concat函式的使用

oracle wm concat column 函式使我們經常會使用到的,下面就教您如何使用oracle wm concat column 函式實現字段合併,如果您對oracle wm concat column 函式使用方面感興趣的話,不妨一看。shopping u id goods num 1 ...