sql >> データベース >  >> RDS >> Oracle

Oracle文字列集約

    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のすべてを取得し、それらを集約します。



    1. SQL ServerのOBJECTPROPERTY()とOBJECTPROPERTYEX():違いは何ですか?

    2. 遅いクエリでMySQLのパフォーマンスの問題を特定する方法

    3. RHEL、Rocky、AlmaLinuxでMySQLレプリケーションを設定する方法

    4. SSISのスクリプトタスクから実行すると、Oracleプロシージャが結果を返さない