Budu předpokládat, že PRIORITY
sloupec je vždy 1, když existuje "hlavní produkt", a nikdy 1 jindy. Z vašich dat to také vypadá, že každý zákazník má pouze jeden „hlavní“ produkt. Budu předpokládat, že je to pravda. Pokud tomu tak není, měli byste mít další sloupec pro rozlišení skupin produktů. Můžete to jednoduše přidat níže.
Složitá/účinná odpověď může být následující:
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
Na zákazníka, PRODUCT
předpokládá, že každý zákazník má hlavní produkt, pak dostane první produkt v pořadí podle priority. Druhý sloupec přebírá pouze priority 2 a používá funkci zřetězení řetězců LISTAGG() ke zřetězení vašich hodnot dohromady.
Velmi bych doporučil blogový příspěvek Roba van Wijka o klauzuli KEEP.
Standardnější řešení SQL by vypadalo takto:
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
tj. najděte vše, co má prioritu 1, použijte toto ke generování svých dvou řádků a poté získejte vše s prioritou 2 a agregujte je.