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

OracleSQLの動的ピボット

    PIVOT XMLを使用せずに、動的ステートメントをPIVOTのINステートメントに入れることはできません。PIVOTXMLは、望ましい出力よりも少ない出力を出力します。ただし、IN文字列を作成して、ステートメントに入力することはできます。

    まず、これが私のサンプルテーブルです;

      myNumber    myValue myLetter
    ---------- ---------- --------
             1          2 A        
             1          4 B        
             2          6 C        
             2          8 A        
             2         10 B        
             3         12 C        
             3         14 A      
    

    まず、INステートメントで使用する文字列を設定します。ここでは、文字列を「str_in_statement」に入れています。文字列の設定には、COLUMNNEW_VALUEとLISTAGGを使用しています。

    clear columns
    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);
    

    文字列は次のようになります:

    'A' AS A,'B' AS B,'C' AS C
    

    次に、PIVOTクエリでStringステートメントを使用します。

    SELECT * FROM 
        (SELECT myNumber, myLetter, myValue FROM myTable)
        PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));
    

    出力は次のとおりです:

      MYNUMBER      A_VAL      B_VAL      C_VAL
    ---------- ---------- ---------- ----------
             1          2          4            
             2          8         10          6 
             3         14                    12 
    

    ただし、制限があります。 連結できる文字列は、4000バイトまでです。



    1. IN値リストによる注文

    2. MySQLは、範囲内の欠落している日付を埋める方法を教えてください。

    3. インスタントファイル初期化:セットアップ中の影響

    4. MySQLで文字列を複数回繰り返す– REPEAT()