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

realizar cálculos sobre datos en tipo de tabla

¿Hay algún motivo para no seleccionarlo en su consulta?

select x.student_id as student_id, cr.course_id as course_i
     , g.score as grade, AVG(g.score) OVER (PARTITION BY x.student_id) as avg_score
 from sf x, grade g, class cs, course cr
where x.no_of_courses>4 
  and x.student_id = g.student_id 
  and cs.course_id = cr.course_id
  and g.class_id = cs.class_id;

Eso pondrá un nuevo campo en su registro llamado avg_score, con el puntaje promedio para un estudiante determinado.

EDITAR:Alternativamente, puede crear una declaración de TIPO de nivel de base de datos para la estructura de registro. Si desea utilizar DML en un tipo de objeto, deberá crearlo en el nivel de la base de datos, no en el nivel de PL/SQL, ya que la base de datos no conoce los tipos definidos por PL/SQL.

CREATE OR REPLACE TYPE t_rec AS OBJECT
(
  student_id number,
  course_id number,
  grade number
);

CREATE OR REPLACE TYPE abc AS TABLE OF t_rec;

Luego, en tu código:

FOR Rec IN (SELECT student_id, AVG(grade) avg_grade 
              FROM TABLE ( cast( v1 as abc) )
             GROUP BY student_id) 
LOOP
   dbms_output.put_line(Rec.student_id, Rec.avg_grade);
END LOOP;

Totalmente sin probar. Sin embargo, esa es la idea general.