sql >> Database >  >> RDS >> Oracle

Maak een draaiweergave in SQL vanuit een SQL-tabel

Een opgeslagen functie (of procedure ) kan worden gemaakt om een ​​SQL voor Dynamic Pivoting te maken, en de resultatenset wordt geladen in een variabele van het 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;

waarin ik twee niveaus van draaien gebruikte:de eerste is binnen de innerlijke query met PIVOT Clausule, en de tweede is in de buitenste query met de voorwaardelijke aggregatielogica. Merk op dat de volgorde van de niveaus in aflopende volgorde moet staan( Z , Y , X ) binnen het verwachte resultaat als in overeenstemming met de beschrijving.

En roep dan

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

van SQL Developer's Command Line om de resultatenset te krijgen

Btw, vermijd het gebruik van gereserveerde zoekwoorden zoals set en level zoals in jouw geval. Ik moest ze citeren om ze te kunnen gebruiken.




  1. FOUT:kolom van relatie bestaat niet PostgreSQL, kan invoegquery niet uitvoeren

  2. Typen SQL Server-cursor - Wat is het verschil tussen LOKALE EN GLOBALE cursor | SQL Server-zelfstudie / TSQL-zelfstudie

  3. Een formulierscherm vernieuwen / bijwerken in Oracle D2k Forms 6i

  4. MySQL-groep per en bestel per