Du skal GROUP BY id
, og betingelsen om "mere end én ordre" går ind i en HAVING
klausul (fordi det er en begrænsning for hver gruppe, ikke på hver enkelt række i inputdataene). Sammenlægningen udføres med 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
I Oracle 10 har du dog ikke LISTAGG()
. Før Oracle 11.2 var en almindelig måde at få det samme resultat på at bruge hierarkiske forespørgsler, noget som nedenfor:
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
;
REDIGERET :
Hvis gentagen KODE for det samme ID skal "adskilles" først, så - ved brug af den anden løsning - er følgende ændringer nødvendige, begge i den inderste underforespørgsel:
-
ændre
SELECT ID, CODE, ...
tilSELECT
DISTINCT
ID, CODE, ...
-
ændre
ROW_NUMBER()
tilDENSE_RANK()