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.