sql >> Base de Datos >  >> RDS >> Oracle

cómo combinar dos valores diferentes de una tabla de un cliente en una fila

Necesitas GROUP BY id , y la condición de "más de un pedido" pasa a HAVING cláusula (porque es una restricción en cada grupo, no en cada fila individual en los datos de entrada). La agregación se realiza con 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

Sin embargo, en Oracle 10 no tiene LISTAGG() . Antes de Oracle 11.2, una forma común de obtener el mismo resultado era usar consultas jerárquicas, algo como lo siguiente:

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 :

Si el CÓDIGO repetido para el mismo ID debe "distinguirse" primero, entonces, utilizando la segunda solución, se necesitan los siguientes cambios, ambos en la subconsulta más interna:

  • cambiar SELECT ID, CODE, ... a SELECT DISTINCT ID, CODE, ...

  • cambiar ROW_NUMBER() a DENSE_RANK()