Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

como combinar dois valores diferentes de uma tabela de um cliente em uma linha


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:

  • alterar SELECT ID, CODE, ... para SELECT DISTINCT ID, CODE, ...

  • alterar ROW_NUMBER() para DENSE_RANK()