简体   繁体   中英

distinct listagg in oracle

I have a query something like this:

select tab1.id,
(
select listagg(tab2.surna||'  '||tab2.name||':'||tab2.addr||'  '||tab2.numb,',  ') within group( order by tab2.name)
from tab2
where tab1.id=tab2.id2id  /*join tab1 with tab2 */
)as address
from tab1

and the result is like:

name_surname1:addr 1,name_surname1:addr 2,name_surname2:addr 3

but the exptected result would be something like:

name_surname1:(addr 1,addr 2),name_surname2:(addr 3)

how can i implement this in order to avoid duplicate records in the display names?

Thanks

I think you need 2 levels of listagg for that. As you didn't provide any script to replicate your data structure, I provide a generic example of my own...

with tab as (
select 's' s,'n' n, 'addr1' addr from dual
union all
select 's' s,'n' n, 'addr2' addr from dual
union all
select 'd' s,'k' n, 'addr3' addr from dual
union all
select 'd' s,'k' n, 'addr4' addr from dual
)
select listagg(res,',') within group (order by res) final_res from ( 
select s || n || ':(' ||listagg( addr,',  ')  within group (order by s,n)  || ')'res  
from tab  
group by s||n
) 

result is

dk:(addr3, addr4),sn:(addr1, addr2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM