Предполагам, че PRIORITY
колоната винаги е 1, когато има "основен продукт" и никога 1 друг път. От вашите данни също изглежда, че всеки клиент има само един „основен“ продукт. Предполагам, че това е вярно. Ако не е, тогава трябва да имате друга колона, за да разграничите продуктовите групи. Можете просто да добавите това към по-долу.
Сложният/ефикасен отговор може да бъде следният:
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
На клиент, PRODUCT
колоната предполага, че всеки клиент има основен продукт, след което получава първия продукт подреден по приоритет. Втората колона приема само когато приоритетът е 2 и използва функцията за конкатенация на низове LISTAGG(), за да обедини вашите стойности заедно.
Горещо препоръчвам публикацията в блога на Роб ван Вийк относно клаузата KEEP.
По-стандартно SQL решение би изглеждало така:
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
т.е. намерете всичко, което има приоритет 1, използвайте това, за да генерирате вашите два реда и след това вземете всичко с приоритет 2 и ги агрегирайте.