Трябва да GROUP BY id
и условието за „повече от една поръчка“ преминава в HAVING
клауза (защото това е ограничение за всяка група, а не за всеки отделен ред във входните данни). Обединяването се извършва с LISTAGG
.
with
test_data ( id, product, code ) as (
select 1, 'Apple' , 145 from dual union all
select 1, 'Grapes', 146 from dual union all
select 2, 'Orange', 147 from dual union all
select 2, 'Apple' , 145 from dual union all
select 2, 'Plum' , 148 from dual union all
select 3, 'Grapes', 146 from dual union all
select 3, 'Orange', 147 from dual union all
select 4, 'Grapes', 146 from dual union all
select 5, 'Orange', 147 from dual
)
-- End of test data (not part of the solution). Query begins below this line.
select id, listagg(code, ' | ') within group (order by id) as codes
from test_data
group by id
having count(*) > 1
;
ID CODE
-- ---------------
1 145 | 146
2 145 | 147 | 148
3 146 | 147
В Oracle 10 обаче нямате LISTAGG()
. Преди Oracle 11.2 често срещан начин за получаване на същия резултат беше използването на йерархични заявки, нещо като по-долу:
select id, ltrim(sys_connect_by_path(code, ' | '), ' | ') as codes
from (
select id, code,
row_number() over (partition by id order by code) as rn
from test_data
)
where connect_by_isleaf = 1 and level > 1
connect by rn = prior rn + 1
and prior id = id
and prior sys_guid() is not null
start with rn = 1
;
РЕДАКТИРАНО :
Ако повтарящият се КОД за един и същ идентификатор трябва първо да бъде „разграничен“, тогава – като се използва второто решение – са необходими следните промени, и двете в най-вътрешната подзаявка:
-
промяна на
SELECT ID, CODE, ...
къмSELECT
DISTINCT
ID, CODE, ...
-
промяна на
ROW_NUMBER()
къмDENSE_RANK()