sql >> Database >  >> RDS >> Oracle

hoe u twee verschillende waarden uit één tabel van één klant in één rij kunt combineren?

U moet GROUP BY id , en de voorwaarde op "meer dan één bestelling" gaat in een HAVING clausule (omdat het een beperking is voor elke groep, niet voor elke afzonderlijke rij in de invoergegevens). De aggregatie wordt gedaan met 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 heb je echter geen LISTAGG() . Vóór Oracle 11.2 was een gebruikelijke manier om hetzelfde resultaat te krijgen het gebruik van hiërarchische query's, zoiets als hieronder:

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
;

BEWERKT :

Als herhaalde CODE voor dezelfde ID eerst moet worden "onderscheiden", dan zijn - met behulp van de tweede oplossing - de volgende wijzigingen nodig, beide in de binnenste subquery:

  • verander SELECT ID, CODE, ... om SELECT DISTINCT ID, CODE, ...

  • verander ROW_NUMBER() naar DENSE_RANK()




  1. Minimale logboekregistratie met INSERT...SELECT in lege geclusterde tabellen

  2. Hoe vind je een specifiek masker in een string - Oracle?

  3. op afstand verbinding maken met mysql

  4. Door de tafel te laten vallen blijft MySQL hangen