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

SQLテーブルからSQLでピボットビューを作成する

    ストアド関数(またはプロシージャ )動的ピボット用のSQLを作成するために作成される場合があり、結果セットはタイプSYS_REFCURSORの変数にロードされます。 :

    CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
      v_recordset SYS_REFCURSOR;
      v_sql       VARCHAR2(32767);
      v_cols_1    VARCHAR2(32767);
      v_cols_2    VARCHAR2(32767);  
    BEGIN
      SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"' , ',' )
              WITHIN GROUP ( ORDER BY "level" DESC )
        INTO v_cols_1
        FROM (
              SELECT DISTINCT "level"
                FROM temp
              );
    
      SELECT LISTAGG( 'MAX(CASE WHEN category = '''||category||''' THEN "'||"level"||'" END) AS "'||"level"||'_'||category||'"' , ',' )
              WITHIN GROUP ( ORDER BY category, "level" DESC )
        INTO v_cols_2
        FROM (
              SELECT DISTINCT "level", category
                FROM temp
              );
    
      v_sql :=
      'SELECT "set", '|| v_cols_2 ||'
         FROM
         (
          SELECT *
            FROM temp
           PIVOT
           (
            MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
           )
          )
          GROUP BY "set"
          ORDER BY "set"'; 
    
      OPEN v_recordset FOR v_sql;
      RETURN v_recordset;
    END;
    

    ここでは、2つのレベルのピボットを使用しました。1つ目は、PIVOTを含む内部クエリ内にあります。 節、および2番目は、条件付き集計ロジックを持つ外部クエリにあります。レベルの順序は降順である必要があることに注意してください(ZYX )説明に準拠していると予想される結果の範囲内。

    そして、呼び出します

    VAR rc REFCURSOR
    EXEC :rc := Get_Categories_RS;
    PRINT rc
    

    結果セットを取得するためにSQLDeveloperのコマンドラインから

    ところで、setなどの予約キーワードの使用は避けてください およびlevel あなたの場合のように。使用できるようにするには、引用する必要がありました。




    1. sqlite(android)でのアクセント付き検索

    2. MySQLデータベースに接続する方法

    3. AndroidSQLiteの挿入または更新

    4. MySQLで過去1か月のデータを取得する方法