2016-02-09 2 views
1

Я новичок в использовании Listagg. Следующий скрипт работает в отношении него, дает мне список значений, но список дублирует значения.Oracle - уникальные значения Listagg

Возможно ли использовать Listagg для возврата только уникального списка значений.

Я использую оракул 10g.

select distinct ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr, 
listagg(case when not li.paco is null then (select unique max(li1.paco) from leos_item li1 where li.av_part_no = li1.av_part_no) end, ', ') within group (order by pd.part_no) inq_no 
from oes_delsegview ds, oes_address ad, oes_opos op, oes_nrbom nr, scm_prodtyp sp, leos_item li, part_description pd 
where ds.delnr = ad.key 
and ad.adr = ds.deladr 
and ds.pos_o_status not in ('9', 'D') 
and ds.pos_c_status not in ('9', 'D') 
and ds.seg_o_status not in ('9', 'D') 
and ds.seg_c_status not in ('9', 'D') 
and ds.cunr in ('W31170','W31172') 
and ds.pos_type != 'RC' 
and ds.ordnr = op.ordnr 
and ds.posnr = op.posnr 
and ds.catnr = pd.catnr 
and ds.prodtyp = pd.prodtyp 
and ds.packtyp = pd.packtyp 
and ds.catnr = nr.p_catnr (+) 
and ds.prodtyp = nr.p_prodtyp (+) 
and ds.packtyp = nr.p_packtyp (+) 
and nr.c_prodtyp = sp.prodtyp (+) 
and sp.prodgrp (+) = 'COMP' 
and substr(nr.c_prodtyp,1,2) not in ('MT','LF') 
and nr.c_catnr = li.catnr (+) 
and nr.c_prodtyp = li.prodtyp (+) 
and nr.c_packtyp = li.packtyp (+) 
and pd.catnr = '9780007938797' 
group by ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr 

Результатом моей Listagg является:

14/061127-12, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16 

То, что я хотел бы видеть это:

14/061127-12, 14/061127-16 

Любая помощь будет оценена.

+0

Возможный дубликат [LISTAGG в oracle для возврата отдельных значений] (http://stackoverflow.com/questions/11510870/listag g-in-oracle-to-return-distinct-values) – ozmike

ответ

2

я снял первый distinct так как ваши уже group by все поля в вашем Select запросе, и заменил case when с select запроса:

select ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr, 
    listagg((select distinct max(li1.paco) from leos_item li1 where li.av_part_no = li1.av_part_no and li.paco is not null), ', ') within group (order by pd.part_no) inq_no 
    from oes_delsegview ds, oes_address ad, oes_opos op, oes_nrbom nr, scm_prodtyp sp, leos_item li, part_description pd 
    where ds.delnr = ad.key 
    and ad.adr = ds.deladr 
    and ds.pos_o_status not in ('9', 'D') 
    and ds.pos_c_status not in ('9', 'D') 
    and ds.seg_o_status not in ('9', 'D') 
    and ds.seg_c_status not in ('9', 'D') 
    and ds.cunr in ('W31170','W31172') 
    and ds.pos_type != 'RC' 
    and ds.ordnr = op.ordnr 
    and ds.posnr = op.posnr 
    and ds.catnr = pd.catnr 
    and ds.prodtyp = pd.prodtyp 
    and ds.packtyp = pd.packtyp 
    and ds.catnr = nr.p_catnr (+) 
    and ds.prodtyp = nr.p_prodtyp (+) 
    and ds.packtyp = nr.p_packtyp (+) 
    and nr.c_prodtyp = sp.prodtyp (+) 
    and sp.prodgrp (+) = 'COMP' 
    and substr(nr.c_prodtyp,1,2) not in ('MT','LF') 
    and nr.c_catnr = li.catnr (+) 
    and nr.c_prodtyp = li.prodtyp (+) 
    and nr.c_packtyp = li.packtyp (+) 
    and pd.catnr = '9780007938797' 
    group by ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr 
+0

Работает ли это для вас? –

+0

Привет, haytem, ​​спасибо, но у меня все же есть тот же результат (список повторяющихся значений). – SMORF

0

Я использовал функцию regexp_replace для удаления дубликатов в моем listagg;

regexp_replace(
    listagg((select distinct max(li1.paco) from leos_item li1 where li.av_part_no = li1.av_part_no and li.paco is not null), ', ') within group (order by pd.part_no) 
    ,'([^,]+)(,\1)+', '\1') inq_no 

Появляется, чтобы работать ОК.

LISTAGG in oracle to return distinct values

+0

Эта замена регулярных выражений имеет ошибку. Попробуйте 'обзоры, поиск': замените на« reviewearch ». Я отправлю фиксированный текст как отдельный ответ. – DKroot

0

Вы можете сделать это с помощью замены регулярных выражений. Вот пример:

-- Citations Per Year - Cited Publications main query. Includes list of unique associated core project numbers, ordered by core project number. 
SELECT ptc.pmid AS pmid, ptc.pmc_id, ptc.pub_title AS pubtitle, ptc.author_list AS authorlist, 
    ptc.pub_date AS pubdate, 
    REGEXP_REPLACE(LISTAGG (ppcc.admin_phs_org_code || 
    TO_CHAR(ppcc.serial_num,'FM000000'), ',') WITHIN GROUP (ORDER BY ppcc.admin_phs_org_code || 
    TO_CHAR(ppcc.serial_num,'FM000000')), 
    '(^|,)(.+)(,\2)+', '\1\2') 
    AS projectNum 
FROM publication_total_citations ptc 
    JOIN proj_paper_citation_counts ppcc 
    ON ptc.pmid = ppcc.pmid 
    AND ppcc.citation_year = 2013 
    JOIN user_appls ua 
    ON ppcc.admin_phs_org_code = ua.admin_phs_org_code 
    AND ppcc.serial_num = ua.serial_num 
    AND ua.login_id = 'EVANSF' 
GROUP BY ptc.pmid, ptc.pmc_id, ptc.pub_title, ptc.author_list, ptc.pub_date 
ORDER BY pmid; 
0

Супер простой ответ решил

select 
regexp_replace('14/061127-12, 14/061127-16, 14/061127-16','([^,]+)(,\1)*(,|$)', '\1\3') 


from dual 

->

14/061127-12, 14/061127-16

увидеть мой полный ответ here

+0

Не работает, если строка сначала не сортируется. Вернее, все дубликаты должны быть рядом друг с другом в списке, чтобы это регулярное выражение работало. – Baodad

+0

см. Мой полный ответ в ссылке выше – ozmike