Voy a asumir que la PRIORITY
la columna siempre es 1 cuando hay un "producto principal" y nunca 1 en ningún otro momento. Según sus datos, también parece que cada cliente tiene solo un producto "principal". Voy a asumir que esto es cierto. Si no es así, debería tener otra columna para distinguir los grupos de productos. Simplemente puede agregar esto a continuación.
La respuesta complicada/eficiente puede ser la siguiente:
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
Violín SQL
Por cliente, el PRODUCT
columna asume que cada cliente tiene un producto principal, luego obtiene el primer producto en orden de prioridad. La segunda columna solo toma donde la prioridad es 2 y usa la función de concatenación de cadenas LISTAGG() para concatenar sus valores.
Recomiendo encarecidamente la publicación de blog de Rob van Wijk sobre la cláusula KEEP.
Una solución SQL más estándar se vería así:
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
es decir, encuentre todo lo que tenga una prioridad de 1, use esto para generar sus dos filas y luego obtenga todo lo que tenga una prioridad de 2 y agréguelos.