Du måste GROUP BY id
, och villkoret för "mer än en beställning" går in i en HAVING
sats (eftersom det är en begränsning för varje grupp, inte på varje enskild rad i indata). Aggregeringen görs 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
Men i Oracle 10 har du inte LISTAGG()
. Före Oracle 11.2 var ett vanligt sätt att få samma resultat att använda hierarkiska frågor, ungefär som nedan:
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
;
REDIGERAD :
Om upprepad KOD för samma ID måste "särskiljas" först, då - med den andra lösningen - behövs följande ändringar, båda i den innersta underfrågan:
-
ändra
SELECT ID, CODE, ...
tillSELECT
DISTINCT
ID, CODE, ...
-
ändra
ROW_NUMBER()
tillDENSE_RANK()