sql >> Databasteknik >  >> RDS >> Oracle

hur man kombinerar två olika värden från en tabell för en kund till en rad

Du måste GROUP BY id , och villkoret för "mer än en beställning" går in i en HAVING sats (eftersom det är en begränsning för varje grupp, inte på varje enskild rad i indata). Aggregeringen görs med 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

Men i Oracle 10 har du inte LISTAGG() . Före Oracle 11.2 var ett vanligt sätt att få samma resultat att använda hierarkiska frågor, ungefär som nedan:

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
;

REDIGERAD :

Om upprepad KOD för samma ID måste "särskiljas" först, då - med den andra lösningen - behövs följande ändringar, båda i den innersta underfrågan:

  • ändra SELECT ID, CODE, ... till SELECT DISTINCT ID, CODE, ...

  • ändra ROW_NUMBER() till DENSE_RANK()




  1. PHP &MySQL paginering

  2. PHP förberedd uttalande infoga från en loop av data

  3. Ställ in oracle-användarlösenords utgång/respitperiod

  4. Mysql:flytta specifika poster ovanpå den resulterande arrayen bredvid ORDER BY