sql >> Base de Datos >  >> RDS >> Oracle

Consulta de pivote dinámico usando Sql Developer Oracle

Está en el camino correcto, pero ese caso falla cuando se define más de una clase para al menos un estudiante. Un ROW_NUMBER() función analítica interna resuelve el problema. Por lo tanto, cree una función almacenada que incluya SYS_REFCURSOR :

CREATE OR REPLACE FUNCTION get_student_rs RETURN SYS_REFCURSOR IS
  recordset SYS_REFCURSOR;
  sqlqry    VARCHAR2(32767);
  cols      VARCHAR2(32767);
BEGIN
  SELECT LISTAGG(''''||name||''' AS "'||name||'"' ,',') WITHIN GROUP (ORDER BY 0)
    INTO cols
    FROM ( SELECT DISTINCT name FROM Students );  

  sqlqry :=
  'SELECT *
     FROM 
     (
      SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY 0) AS rn,
             s.*             
        FROM Students s     
      )
    PIVOT (
           MAX(class) FOR name IN ('||cols||')
           )
    ORDER BY rn';

  OPEN recordset FOR sqlqry;
  RETURN recordset;
END;
/

Suponga que hay un registro más insertado;

Name     School    Class
----     ------    -------
Jim      Hs        History

luego invocar

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

de Desarrollador de SQL Línea de comando para ver el conjunto de resultados que será:

RN  SCHOOL  Jim      John     Matthew  Steve
--  ------  -------  -------  -------  ------
1   Hs      Maths    English  Science  Maths
2   Hs      History