Zakładam, że PRIORITY
kolumna to zawsze 1, gdy istnieje „główny produkt”, i nigdy 1 w innym czasie. Z Twoich danych wynika również, że każdy klient ma tylko jeden „główny” produkt. Zakładam, że to prawda. Jeśli tak nie jest, powinieneś mieć kolejną kolumnę, aby rozróżnić grupy produktów. Możesz po prostu dodać to poniżej.
Skomplikowana/efektywna odpowiedź może być następująca:
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
Skrzypce SQL
Na klienta PRODUCT
kolumna zakłada, że każdy klient ma produkt główny, a następnie otrzymuje pierwszy produkt w kolejności według priorytetu. Druga kolumna przyjmuje tylko tam, gdzie priorytet wynosi 2 i używa funkcji konkatenacji ciągów LITAGG() do łączenia wartości.
Gorąco polecam wpis na blogu Roba van Wijka o klauzuli KEEP.
Bardziej standardowe rozwiązanie SQL wyglądałoby tak:
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. znajdź wszystko, co ma priorytet 1, użyj tego do wygenerowania dwóch wierszy, a następnie uzyskaj wszystko z priorytetem 2 i zagreguj je.