Oracle
 sql >> Baza danych >  >> RDS >> Oracle

jak połączyć dwie różne wartości z jednej tabeli jednego klienta w jeden wiersz

Musisz GROUP BY id , a warunek „więcej niż jedno zamówienie” przechodzi do HAVING klauzula (ponieważ jest to ograniczenie dla każdej grupy, a nie dla każdego pojedynczego wiersza w danych wejściowych). Agregacja odbywa się za pomocą 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

Jednak w Oracle 10 nie masz LISTAGG() . Przed Oracle 11.2 powszechnym sposobem uzyskania tego samego wyniku było użycie zapytań hierarchicznych, takich jak poniżej:

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
;

EDYTOWANO :

Jeśli powtarzający się KOD dla tego samego ID musi być najpierw „odróżniony”, to – korzystając z drugiego rozwiązania – potrzebne są następujące zmiany, oba w najgłębszym podzapytaniu:

  • zmień SELECT ID, CODE, ... do SELECT DISTINCT ID, CODE, ...

  • zmień ROW_NUMBER() do DENSE_RANK()




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj tabelę Oracle o wartości z pliku CSV

  2. Jak utworzyć PL/SQL SYS_REFCURSOR w bazie danych Oracle

  3. sprawdzanie poprawności dokumentu xml w źródle java Oracle

  4. Jak zamienić kolumnę na rzędy w Oracle 10g

  5. Migracja bazy danych Oracle z AWS EC2 do AWS RDS, część 3