Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Utwórz widok przestawny w SQL z tabeli SQL

Przechowywana funkcja (lub procedura ) może zostać utworzony w celu utworzenia kodu SQL dla dynamicznego obracania, a zestaw wyników jest ładowany do zmiennej 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;

w którym użyłem dwóch poziomów przestawiania:pierwszy znajduje się w wewnętrznym zapytaniu obejmującym PIVOT Klauzula, a druga znajduje się w zewnętrznym zapytaniu posiadającym warunkową logikę agregacji. Zauważ, że kolejność poziomów powinna być w porządku malejącym ( Z , Y , X ) w oczekiwanym wyniku jako zgodny z opisem.

A następnie wywołaj

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

z wiersza poleceń SQL Developer, aby uzyskać zestaw wyników

Btw, unikaj używania zarezerwowanych słów kluczowych, takich jak set i level tak jak w twoim przypadku. Musiałem je zacytować, aby móc z nich korzystać.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC zwraca pusty zestaw wyników

  2. Jak wyeliminować godziny wolne od pracy w Oracle

  3. problem ze znalezieniem listy plików w katalogu

  4. Kolejność Oracle SQL według problemów z podzapytaniami!

  5. Wymuś upuszczenie globalnej tabeli temp. Oracle