PRIORITY
「主な製品」がある場合、列は常に1であり、それ以外の場合は1ではありません。あなたのデータから、各顧客が「主な」製品を1つだけ持っているようにも見えます。これは本当だと思います。そうでない場合は、製品グループを区別するための別の列が必要です。これを以下に追加するだけです。
複雑で効率的な答えは次のようになります:
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フィドル
顧客ごとに、PRODUCT
列は、すべての顧客が主な製品を持っていると想定し、優先順位に従って最初の製品を取得します。 2番目の列は、優先度が2の場合にのみ取得され、文字列連結関数LISTAGG()を使用して値を連結します。
KEEP句に関するRobvanWijkのブログ投稿を強くお勧めします。
より標準的なSQLソリューションは次のようになります。
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
つまり、優先度1のすべてを検索し、これを使用して2つの行を生成してから、優先度2のすべてを取得し、それらを集約します。