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

列を行のオラクルに転置する

    純粋なSQL範囲を手動で配置する必要があるため、多くのコーディングが必要になります 値と範囲の間にまったく関係がないためです。関係があった場合は、ケースを使用できます 表現し、範囲を動的に構築します 。

    SQL> WITH DATA AS
      2    (SELECT 50 "1-99transval",
      3      90 "100-200transval",
      4      80 "200-300transval",
      5      67 "1-99nontransval",
      6      58 "100-200nontransval",
      7      88 "200-300nontransval"
      8    FROM dual
      9    )
     10  SELECT '1-99' range,
     11    "1-99transval" transval,
     12    "1-99nontransval" nontransval
     13  FROM DATA
     14  UNION
     15  SELECT '100-200' range,
     16    "100-200transval",
     17    "100-200nontransval" nontransval
     18  FROM DATA
     19  UNION
     20  SELECT '200-300' range,
     21    "200-300transval",
     22    "200-300nontransval" nontransval
     23  FROM DATA;
    
    RANGE     TRANSVAL NONTRANSVAL
    ------- ---------- -----------
    1-99            50          67
    100-200         90          58
    200-300         80          88
    

    Oracleデータベース11gリリース1から 以上では、 UNPIVOTを使用できます

    SQL> WITH DATA AS
      2    (SELECT 50 "1-99transval",
      3      90 "100-200transval",
      4      80 "200-300transval",
      5      67 "1-99nontransval",
      6      58 "100-200nontransval",
      7      88 "200-300nontransval"
      8    FROM dual
      9    )
     10  SELECT *
     11  FROM   DATA
     12  UNPIVOT( (transval,nontransval)
     13  FOR RANGE IN ( ("1-99transval","1-99nontransval") AS '1-99'
     14                ,("100-200transval","100-200nontransval") AS '100-200'
     15                ,("200-300transval","200-300nontransval") AS '200-300'));
    
    RANGE     TRANSVAL NONTRANSVAL
    ------- ---------- -----------
    1-99            50          67
    100-200         90          58
    200-300         80          88
    

    上記の場合、 WITHを置き換える必要があります サブクエリとして既存のクエリを含む句 。 UNIONに他の列を含める必要があります 。

    PL / SQL EXECUTE IMMEDIATE を(乱用)使用できます 列名を抽出して「範囲」を取得します 動的SQL

    ただし、まだ表示していない既存のクエリを変更/書き換えた方がはるかに優れています。



    1. MariaDBで特定の文字のASCIIコードを返す2つの方法

    2. PostgreSQLの利点

    3. 複数のPHPスクリプトを同時に実行する(データベースループの問題)

    4. PL-SQLエラーでの選択:選択後のINTO