有以下資料
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值,這是後話,先貼**
selectt5.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的,而且會報上面的錯誤,網上的一些解決方案都沒解決,有人寫了自定義函式,親測完美解決
createorreplace
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...