Jag kommer att anta att PRIORITY
kolumn är alltid 1 när det finns en "huvudprodukt" och aldrig 1 någon annan gång. Från din data ser det också ut som att varje kund bara har en "huvudprodukt". Jag kommer att anta att detta är sant. Om det inte är det bör du ha en annan kolumn för att särskilja produktgrupper. Du kan helt enkelt lägga till detta i nedan.
Det komplicerade/effektiva svaret kan vara följande:
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 kund, PRODUCT
kolumnen antar att varje kund har en huvudprodukt och får sedan den första produkten i prioritetsordning. Den andra kolumnen tar bara där prioritet är 2 och använder strängsammansättningsfunktionen LISTAGG() för att sammanfoga dina värden.
Jag rekommenderar starkt Rob van Wijks blogginlägg om KEEP-klausulen.
En mer standard SQL-lösning skulle se ut så här:
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.v.s. hitta allt som har en prioritet på 1, använd detta för att generera dina två rader och hämta sedan allt med en prioritet på 2 och aggregera dessa.