Oracle
 sql >> база данни >  >> RDS >> Oracle

Създаване на централен изглед в SQL от SQL таблица

Съхранена функция (или процедура ) може да бъде създаден, за да се създаде SQL за динамично завъртане и резултантният набор се зарежда в променлива от тип 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;

в който използвах две нива на завъртане:първото е във вътрешната заявка, включваща PIVOT Клауза, а втората е във външната заявка, имаща логиката на условно агрегиране. Забележете, че редът на нивата трябва да бъде в низходящ ред ( Z , Y , X ) в рамките на очаквания резултат като съответстващ на описанието.

И след това извикайте

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

от командния ред на SQL Developer, за да получите набора от резултати

Между другото, избягвайте използването на запазени ключови думи като set и level както във вашия случай. Трябваше да ги цитирам, за да мога да ги използвам.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Монитор за промяна на таблицата Oracle

  2. Oracle намери ограничение

  3. Трябва ли да изтрия или деактивирам ред в релационна база данни?

  4. Oracle изтрива редове от множество таблици

  5. Как да генерирате FRD трасиране в Oracle Apps 11i/R12