sql >> Database teknologi >  >> RDS >> Oracle

Opret pivotvisning i SQL fra en SQL-tabel

En lagret funktion (eller procedure ) kan oprettes for at oprette en SQL til dynamisk pivoting, og resultatsættet indlæses i en variabel af typen 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;

hvor jeg brugte to niveauer af pivotering :det første er inden for den indre forespørgsel, der involverer PIVOT Klausul, og den anden er i den ydre forespørgsel med den betingede aggregeringslogik. Bemærk, at rækkefølgen af ​​niveauer skal være i faldende rækkefølge( Z , Y , X ) inden for det forventede resultat som i overensstemmelse med beskrivelsen.

Og derefter påberåbe

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

fra SQL Developer's Command Line for at få resultatet sat

Btw, undgå at bruge reserverede søgeord såsom set og level som i dit tilfælde. Jeg var nødt til at citere dem for at kunne bruge.




  1. Henvis til et alias andetsteds i SELECT-listen

  2. Returner tabelprivilegier fra en sammenkædet server i SQL Server (T-SQL-eksempler)

  3. ingen sqljdbc_auth i java.library.path

  4. Hvornår skal jeg lukke DatabaseHelper?