Create Pivot view in SQL from a SQL table

前端 未结 1 1291
后悔当初
后悔当初 2021-01-25 10:24

I have the following table TEMP

I want to create a pivot view using SQL, Ordered by CATEGORY ASC ,by LEVEL DESC and S

相关标签:
1条回答
  • 2021-01-25 11:10

    A stored function(or procedure) might be created in order to create a SQL for Dynamic Pivoting, and the result set is loaded into a variable of type 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;
    

    in which I used two levels of pivoting : the first is within the inner query involving PIVOT Clause, and the second is in the outer query having the conditional aggregation logic. Notice that the order of levels should be in the descending order( Z, Y, X ) within the expected result as conforming to the description.

    And then invoke

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

    from SQL Developer's Command Line in order to get the result set

    Btw, avoid using reserved keywords such as set and level as in your case. I needed to quote them in order to be able to use.

    0 讨论(0)
提交回复
热议问题