Jeg vil antage, at PRIORITY
kolonnen er altid 1, når der er et "hovedprodukt" og aldrig 1 på andre tidspunkter. Ud fra dine data ser det også ud til, at hver kunde kun har ét "hoved" produkt. Jeg vil antage, at dette er sandt. Hvis det ikke er det, skal du have en anden kolonne til at skelne mellem produktgrupper. Du kan blot tilføje dette til nedenstående.
Det komplicerede/effektive svar kan være som følger:
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
Pr. kunde, PRODUCT
kolonnen antager, at hver kunde har et hovedprodukt, og derefter får det første produkt i rækkefølge efter prioritet. Den anden kolonne tager kun hvor prioriteten er 2 og bruger strengsammenkædningsfunktionen LISTAGG() til at sammenkæde dine værdier.
Jeg vil varmt anbefale Rob van Wijks blogindlæg om KEEP-klausulen.
En mere standard SQL-løsning ville se sådan ud:
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
dvs. find alt, der har en prioritet på 1, brug dette til at generere dine to rækker og få derefter alt med en prioritet på 2 og aggregér dem.