Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment combiner deux valeurs différentes d'une table d'un client en une seule ligne

Vous devez GROUP BY id , et la condition sur "plus d'une commande" passe dans un HAVING clause (car il s'agit d'une contrainte sur chaque groupe, et non sur chaque ligne individuelle dans les données d'entrée). L'agrégation se fait avec 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

Cependant, dans Oracle 10, vous n'avez pas LISTAGG() . Avant Oracle 11.2, un moyen courant d'obtenir le même résultat consistait à utiliser des requêtes hiérarchiques, comme ci-dessous :

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
;

EDITÉ :

Si des CODE répétés pour le même ID doivent d'abord être "distincts", alors - en utilisant la deuxième solution - les changements suivants sont nécessaires, tous deux dans la sous-requête la plus profonde :

  • modifier SELECT ID, CODE, ... à SELECT DISTINCT ID, CODE, ...

  • modifier ROW_NUMBER() à DENSE_RANK()