oracle的wm concat函式實現行轉列

2022-02-24 19:35:37 字數 3607 閱讀 6938

有以下資料

deptname

phone

username

isboss

部門a**1

員工a0

部門a**1

領導a1

部門b**2

員工b0

部門b**2

員工c0

部門b**2

領導d1

需要展示效果

deptname

phone

boss

emp部門a

**1領導a

員工a部門b

**2領導d

員工b,員工c

因為是oracle10g的原因,所以使用了wm_concat函式,但對wm_concat結果長度有限制,超出會報ora-22922:不存在的lob值,這是後話,先貼**

select

t5.deptname,

max(t5.tel),

dbms_lob.substr(wmsys.wm_concat(to_char(t5.boss))) boss,

dbms_lob.substr(wmsys.wm_concat(to_char(t5.notboss))) notboss

from (select

t1.name deptname,

t1.tel tel,

case

t2.isboss

when

1then

t2.true_name

endboss,

case

t2.isboss

when

0then

t2.true_name

endnotboss

from

t_duty t

left

join

t_department t1

on t.dep_id =

t1.dep_id

left

join

t_contacts t2

on t.contacts_id =

t2.contacts_id

where t.duty_time =

trunc(sysdate) ) t5

group

by t5.deptname

同樣的情況的如果是oracle11gr2版本可以用listagg函式,據說可以解決上面的報錯問題,這個有待以後測試

但是我現在的是10g的,而且會報上面的錯誤,網上的一些解決方案都沒解決,有人寫了自定義函式,親測完美解決

create

orreplace

type zh_concat_im

authid

current_user

asobject

( curr_str

varchar2(32767

), static

function odciaggregateinitialize(sctx in out zh_concat_im) return

number

, member

function odciaggregateiterate(self in

out zh_concat_im,

p1 invarchar2) return

number

, member

function odciaggregateterminate(self in

zh_concat_im,

returnvalue out

varchar2

, flags

innumber

)

return

number

, member

function odciaggregatemerge(self in

out zh_concat_im,

sctx2

in zh_concat_im) return

number);/

create

orreplace

type body zh_concat_im

isstatic

function odciaggregateinitialize(sctx in

out zh_concat_im)

return

number

isbegin

sctx :

= zh_concat_im(null

) ;

return

odciconst.success;

end; member

function odciaggregateiterate(self in

out zh_concat_im,

p1 invarchar2)

return

number

isbegin

if(curr_str is

notnull) then

curr_str :

= curr_str ||':

'||p1;

else

curr_str :

=p1;

endif

;

return

odciconst.success;

end; member

function odciaggregateterminate(self in

zh_concat_im,

returnvalue out

varchar2

, flags

innumber

)

return

number

isbegin

returnvalue :

=curr_str ;

return

odciconst.success;

end; member

function odciaggregatemerge(self in

out zh_concat_im,

sctx2

inzh_concat_im)

return

number

isbegin

if(sctx2.curr_str is

notnull) then

self.curr_str :

= self.curr_str ||':

'||sctx2.curr_str ;

endif

;

return

odciconst.success;

end;end;/

create

orreplace

function zh_concat(p1 varchar2

)return

varchar2

aggregate using zh_concat_im ;

/

Oracle中的wm concat 函式

博主最近在學習使用oracle,前幾天寫 的時候有乙個任務,查詢到某一列的合併資料並且要求不能相同,我在網上查了查原來可以使用wm concat 這個函式來實現。一 wm concat 函式是oracle中獨有的,mysql中有乙個group concat 函式。這兩個函式的作用是相同的,它們的功能...

Oracle建立WM CONCAT函式

oracle建立wm concat函式 wm concat這個函式會出錯,所以從 11g開始。官方不認可 wm concat.然後就沒這個函式了,下面就是建立wm concat這個函式的步驟 用sqlplus登入 conn sys pass word as sysdba 一 忘記除sys syste...

Oracle建立WM CONCAT函式

oracle建立wm concat函式 wm concat這個函式會出錯,所以從 11g開始。官方不認可 wm concat.然後就沒這個函式了,下面就是建立wm concat這個函式的步驟 用sqlplus登入 conn sys pass word as sysdba 一 忘記除sys syste...