Oracle
 sql >> Datenbank >  >> RDS >> Oracle

wie man zwei verschiedene Werte aus einer Tabelle eines Kunden in einer Zeile kombiniert

Sie müssen GROUP BY id , und die Bedingung "mehr als eine Bestellung" geht in ein HAVING über -Klausel (da es sich um eine Einschränkung für jede Gruppe handelt, nicht für jede einzelne Zeile in den Eingabedaten). Die Aggregation erfolgt mit 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

In Oracle 10 gibt es jedoch kein LISTAGG() . Vor Oracle 11.2 war eine übliche Methode, um dasselbe Ergebnis zu erhalten, die Verwendung hierarchischer Abfragen, etwa wie folgt:

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
;

BEARBEITET :

Wenn wiederholter CODE für die gleiche ID zuerst "unterscheidbar" werden soll, dann sind - unter Verwendung der zweiten Lösung - die folgenden Änderungen erforderlich, beide in der innersten Unterabfrage:

  • SELECT ID, CODE, ... ändern zu SELECT DISTINCT ID, CODE, ...

  • ROW_NUMBER() ändern zu DENSE_RANK()