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

Agregasi string Oracle

Saya akan berasumsi bahwa PRIORITY kolom selalu 1 ketika ada "produk utama" dan tidak pernah 1 di waktu lain. Dari data Anda, sepertinya setiap pelanggan hanya memiliki satu produk "utama". Saya akan berasumsi bahwa ini benar. Jika tidak, Anda harus memiliki kolom lain untuk membedakan grup produk. Anda cukup menambahkan ini ke bawah.

Jawaban yang rumit/efisien mungkin sebagai berikut:

select customer
     , max(product) keep (dense_rank first order by priority) as main_product
     , listagg(case when priority = 2 then product end, ', ')
         within group (order by product) as sub_product
  from products
 group by customer

SQL Fiddle

Per pelanggan, PRODUCT kolom mengasumsikan bahwa setiap pelanggan memiliki produk utama, kemudian mendapatkan produk pertama yang diurutkan berdasarkan prioritas. Kolom kedua hanya mengambil di mana prioritasnya adalah 2 dan menggunakan fungsi penggabungan string LISTAGG() untuk menggabungkan nilai-nilai Anda.

Saya sangat merekomendasikan posting blog Rob van Wijk tentang klausa KEEP.

Solusi SQL yang lebih standar akan terlihat seperti ini:

select a.customer, a.product as main_product
     , listagg(b.product, ', ') within group (order by b.product) as sub_product
  from products a
  join products b
    on a.customer = b.customer
 where a.priority = 1
   and b.priority = 2
 group by a.customer, a.product

yaitu temukan semua yang memiliki prioritas 1, gunakan ini untuk menghasilkan dua baris Anda dan kemudian dapatkan semuanya dengan prioritas 2 dan gabungkan itu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alat pengembang untuk mengakses database secara langsung

  2. Cara Mendeklarasikan Pengecualian Buat Pengguna Menggunakan Variabel Pengecualian Di Database Oracle

  3. Cara mengkloning lingkungan R12.2

  4. Cara mengatur OTA di R12 dan 11i

  5. ORA-04021:batas waktu terjadi saat menunggu untuk mengunci objek