Oracle wm_concat函數排序的解決方法


默認情況下,使用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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM