ホームページ >データベース >mysql チュートリアル >動的値を使用して Oracle SQL テーブルを動的にピボットする方法

動的値を使用して Oracle SQL テーブルを動的にピボットする方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-24 01:01:10338ブラウズ

How to Dynamically Pivot Oracle SQL Tables with Dynamic Values?

Oracle SQL 動的ピボットと動的値

Oracle SQL でピボット テーブルを使用する場合の一般的な課題は、動的な値を含むピボット テーブルを作成することです。従来のアプローチは、ピボット テーブルの IN ステートメントで使用される静的文字列に新しい値を手動で追加することであり、非効率的です。

動的 IN ステートメントの制限事項

サブクエリ、PL/SQL 変数、またはネストしたクエリを使用して、動的ステートメントを PIVOT IN ステートメントに直接埋め込むことはサポートされていません。さらに、PIVOT XML を使用すると、出力が最適化されない可能性があります。

解決策: 動的 IN 文字列を作成します

これらの制限を克服するには、動的な IN 文字列を作成する方法を使用できます。ステップバイステップのガイドは次のとおりです:

  1. 動的文字列を生成するための SELECT ステートメントを作成します:

    • COLUMN NEW_VALUE と LISTAGG を使用して、目的の値をカンマで区切って単一の文字列に連結します。
    • この文字列を str_in_statement などの変数に保存します。
  2. 例: 次のテーブルの例を考えてみましょう:

<code>| myNumber | myValue | myLetter |
|---|---|---|
| 1 | 2 | A |
| 1 | 4 | B |
| 2 | 6 | C |
| 2 | 8 | A |
| 2 | 10 | B |
| 3 | 12 | C |
| 3 | 14 | A |</code>

動的 IN 文字列を生成するには、次のステートメントを実行します:

<code class="language-sql">COLUMN temp_in_statement new_value str_in_statement
SELECT DISTINCT 
    LISTAGG('''' || myLetter || ''' AS ' || myLetter,',')
        WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement 
    FROM (SELECT DISTINCT myLetter FROM myTable);</code>
  1. 動的文字列をピボット クエリに組み込みます:

    • 動的文字列を含む変数をピボット クエリの IN パラメーターとして使用します。
  2. ピボット クエリの例:

<code class="language-sql">SELECT * FROM 
    (SELECT myNumber, myLetter, myValue FROM myTable)
    PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));</code>

出力:

<code>| MYNUMBER | A_VAL | B_VAL | C_VAL |
|---|---|---|---|
| 1 | 2 | 4 | NULL |
| 2 | 8 | 10 | 6 |
| 3 | 14 | NULL | 12 |</code>

制限事項:

このメソッドの制限は、連結できる最大文字列サイズが 4000 バイトであることです。

以上が動的値を使用して Oracle SQL テーブルを動的にピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。