sql >> Databáze >  >> RDS >> Oracle

Vytvořte kontingenční zobrazení v SQL z tabulky SQL

Uložená funkce (nebo procedura ) může být vytvořen za účelem vytvoření SQL pro dynamické pivotování a výsledná sada je načtena do proměnné typu 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;

ve kterém jsem použil dvě úrovně pivotování:první je v rámci vnitřního dotazu zahrnujícího PIVOT Klauzule a druhá je ve vnějším dotazu s logikou podmíněné agregace. Všimněte si, že pořadí úrovní by mělo být v sestupném pořadí ( Z , Y , X ) v rámci očekávaného výsledku, který odpovídá popisu.

A pak vyvolat

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

z příkazového řádku vývojáře SQL, abyste získali sadu výsledků

Btw, vyhněte se používání vyhrazených klíčových slov, jako je set a level jako ve vašem případě. Potřeboval jsem je citovat, abych je mohl použít.




  1. Mohu nastavit výchozí schéma pro v rámci uložené procedury?

  2. Nastavení Django na používání MySQL

  3. Nativní knihovna sqljdbc_auth.dll je již načtena v jiném classloaderu

  4. SQL nezobrazuje hodnoty null v dotazu nerovná se?