Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

cara menggabungkan dua nilai berbeda dari satu tabel satu pelanggan menjadi satu baris

Anda perlu GROUP BY id , dan kondisi "lebih dari satu pesanan" menjadi HAVING klausa (karena merupakan kendala pada setiap grup, bukan pada setiap baris individu dalam data input). Agregasi dilakukan dengan 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

Namun, di Oracle 10 Anda tidak memiliki LISTAGG() . Sebelum Oracle 11.2, cara umum untuk mendapatkan hasil yang sama adalah dengan menggunakan kueri hierarkis, seperti di bawah ini:

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
;

DIEDIT :

Jika KODE berulang untuk ID yang sama perlu "dibedakan" terlebih dahulu, kemudian - menggunakan solusi kedua - perubahan berikut diperlukan, keduanya di subquery terdalam:

  • ubah SELECT ID, CODE, ... untuk SELECT DISTINCT ID, CODE, ...

  • ubah ROW_NUMBER() ke 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. Mencocokkan nilai kolom duplikat Oracle menggunakan Soundex, Jaro Winkler dan Edit Distance (UTL_MATCH)

  2. ORA-12154 tidak dapat menyelesaikan pengidentifikasi koneksi yang ditentukan

  3. Contoh Oracle FOR LOOP REVERSE

  4. Bagaimana cara meningkatkan buffer dbms_output?

  5. perbarui menggunakan for loop di plsql