Você precisa
GROUP BY id
, e a condição de "mais de um pedido" entra em um HAVING
cláusula (porque é uma restrição em cada grupo, não em cada linha individual nos dados de entrada). A agregação é feita com 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
No entanto, no Oracle 10 você não tem
LISTAGG()
. Antes do Oracle 11.2, uma maneira comum de obter o mesmo resultado era usar consultas hierárquicas, algo como abaixo: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
;
EDITADO :
Se o CÓDIGO repetido para o mesmo ID precisar ser "distinguido" primeiro, então - usando a segunda solução - as seguintes alterações são necessárias, tanto na subconsulta mais interna:
-
alterarSELECT ID, CODE, ...
paraSELECT
DISTINCT
ID, CODE, ...
-
alterarROW_NUMBER()
paraDENSE_RANK()