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

Oracleは行を列にピボットします

    1つのオプションは、PIVOTを使用することです。 条項

    SELECT *
      FROM (SELECT t1.*, t2.tipo, t2.valor 
              FROM table1 t1 
              JOIN table2 t2 
                ON t2.id = t1.id)
     PIVOT 
     (
      MAX(valor) FOR tipo IN ( 't1' AS "t1", 't2' AS "t2", 't3' AS "t3" )
     )  
    

    しかし、これは静的です。 tipoの異なる値として更新する必要があります 列が追加されます。動的にするために、関数を作成できます

    CREATE OR REPLACE FUNCTION Get_Pivoted_Cols RETURN SYS_REFCURSOR IS
      v_recordset SYS_REFCURSOR;
      v_sql       VARCHAR2(32767); 
      v_cols      VARCHAR2(32767);      
    BEGIN
      SELECT LISTAGG( ''''||tipo||''' AS "'||tipo||'"' , ',' )
              WITHIN GROUP ( ORDER BY tipo )  
        INTO v_cols
        FROM ( SELECT DISTINCT tipo FROM table2 );
    
      v_sql := 'SELECT *
                  FROM (SELECT t1.*, t2.tipo, t2.valor 
                          FROM table1 t1 
                          JOIN table2 t2 
                            ON t2.id = t1.id)
                 PIVOT 
                 (
                  MAX(valor) FOR tipo IN ( '|| v_cols ||' )
                 )';   
    
      OPEN v_recordset FOR v_sql;
      RETURN v_recordset;
    END;
    /
    

    次に、

    を使用して電話をかけます
    VAR rc REFCURSOR
    EXEC :rc := Get_Pivoted_Cols;
    PRINT rc
    

    SQL開発者のコ​​ンソールから。

    デモ



    1. JDBCのJavaタイプからPostgresltreeへ

    2. sysdateから年を引く方法

    3. 簡単なクエリを使用して、CSVなどの他のファイル形式に実際に変換せずにJSONファイルをMySQLデータベースにインポートするにはどうすればよいですか?

    4. Mysql:集計関数はgroupbyなしでは機能しません