sql >> Database teknologi >  >> RDS >> Oracle

udføre beregninger på data i tabeltype

Er der en grund til ikke at vælge det i din forespørgsel?

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;

Det vil sætte et nyt felt i din post ved navn avg_score, med den gennemsnitlige score for en given elev.

EDIT:Alternativt kan du oprette en TYPE-deklaration på databaseniveau for poststrukturen. Hvis du vil bruge DML på en objekttype, skal du oprette den på databaseniveau, ikke på PL/SQL-niveau, da databasen ikke kender til PL/SQL-definerede typer.

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;

Derefter, i din kode:

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;

Fuldstændig uafprøvet. Det er dog den generelle idé.




  1. MySQL FEJL 1290 (HY000) --secure-file-priv mulighed

  2. SQL Server 2012 forespørger Access 2007-data ved hjælp af OPENROWSET-fejl

  3. oracle sql udviklerværktøj - data ikke tilgængelige efter commit

  4. Opret kun en tabel, hvis den ikke findes i MariaDB