Presumo che la PRIORITY
la colonna è sempre 1 quando c'è un "prodotto principale" e mai 1 in qualsiasi altro momento. Dai tuoi dati sembra anche che ogni cliente abbia un solo prodotto "principale". Presumo che questo sia vero. In caso contrario, dovresti avere un'altra colonna per distinguere i gruppi di prodotti. Puoi semplicemente aggiungerlo in basso.
La risposta complicata/efficiente potrebbe essere la seguente:
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 Violino
Per cliente, il PRODUCT
colonna presuppone che ogni cliente abbia un prodotto principale, quindi ottiene il primo prodotto in ordine di priorità. La seconda colonna prende solo dove la priorità è 2 e usa la funzione di concatenazione di stringhe LISTAGG() per concatenare i tuoi valori insieme.
Consiglio vivamente il post sul blog di Rob van Wijk sulla clausola KEEP.
Una soluzione SQL più standard sarebbe simile a questa:
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
cioè trova tutto ciò che ha priorità 1, usa questo per generare le tue due righe e quindi ottieni tutto con priorità 2 e aggrega quelle.