Ik ga ervan uit dat de PRIORITY
kolom is altijd 1 als er een "hoofdproduct" is en nooit een andere keer. Uit uw gegevens blijkt ook dat elke klant slechts één "hoofd" product heeft. Ik ga ervan uit dat dit waar is. Als dit niet het geval is, zou u een andere kolom moeten hebben om productgroepen te onderscheiden. Je kunt dit eenvoudig hieronder toevoegen.
Het ingewikkelde/efficiënte antwoord kan als volgt zijn:
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 klant, het PRODUCT
kolom gaat ervan uit dat elke klant een hoofdproduct heeft en krijgt vervolgens het eerste product op volgorde van prioriteit. De tweede kolom neemt alleen waar de prioriteit 2 is en gebruikt de tekenreeksaaneenschakelingsfunctie LISTAGG() om uw waarden samen te voegen.
Ik zou de blogpost van Rob van Wijk over de KEEP-clausule ten zeerste aanbevelen.
Een meer standaard SQL-oplossing ziet er als volgt uit:
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
d.w.z. vind alles dat een prioriteit van 1 heeft, gebruik dit om uw twee rijen te genereren en verkrijg dan alles met een prioriteit van 2 en aggregeer deze.