預設情況下,使用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 ...