【问题标题】:Insert the AVG of a student's grade into another table's attribute called final grade将学生成绩的 AVG 插入另一个表的属性,称为最终成绩
【发布时间】:2021-06-08 19:14:13
【问题描述】:

我创建了这个数据库:

create table student(
student_cod int primary key,
name varchar(30),
birth_date date);

create table course(
code_c int primary key,
description_c varchar(200));

create table discipline(
coddisc int primary key,
description_d varchar(200),
credits int,
course_code int,
constraint fk_coursecode foreign key (course_code) references course (code_c));

create table registration(
student_code int,
code_disc int,
date date,
grade1 number(3,1),
grade2 number(3,1),
grade3 number(3,1),
constraint fk_student foreign key (student_code) references student (student_cod),
constraint fk_coddisc foreign key (cod_disc) references discipline (coddisc));

create table history(
semester int,
final_grade number(3,1),
cod_student int,
cod_dis int,
constraint fk_codal foreign key (cod_student) references student (student_cod),
constraint fk_coddi foreign key (cod_dis) references discipline (coddisc));

insert into student values ​​(01, 'John', to_date('07/04/1998', 'MM/DD/YYYY'));
insert into student values ​​(02, 'Anna', to_date('07/03/2000', 'MM/DD/YYYY'));
insert into student values ​​(03, 'Marck', to_date('05/12/1995', 'MM/DD/YYYY'));

insert into course values ​​(01, 'Computer Science');

insert into discipline values ​​(01, 'Algorithms 1', 4, 1);

insert into registration values ​​(01, 01, to_date('08/01/2018', 'DD/MM/YYYY'), 9.3, 10.0, 8.8);
insert into registration values ​​(02, 01, to_date('07/01/2019', 'DD/MM/YYYY'), 8.7, 7.5, 10.0);
insert into registration values ​​(03, 01, to_date('09/01/2017', 'DD/MM/YYYY'), 10.0, 10.0, 9.5);

insert into history values ​​(01, 0.0, 01, 01);
insert into history values ​​(01, 0.0, 02, 01);
insert into history values ​​(01, 0.0, 03, 01);

我想知道如何取一个学生的 3 个成绩的平均值,并使用一个程序将此值插入到历史表中的最终成绩中。我显然必须更新它,我尝试为它创建一个过程,但它不起作用。

【问题讨论】:

    标签: database oracle procedure


    【解决方案1】:

    您可以使用单个更新语句更新HISTORY 表,而不需要过程。

    UPDATE history h
       SET h.final_grade =
               (SELECT (r.grade1 + r.grade2 + r.grade3) / 3
                  FROM registration r
                 WHERE r.student_code = h.cod_student AND r.code_disc = h.cod_dis);
    

    一旦您的HISTORY 表中有多个学期,您将需要某种方法将REGISTRATION 表中的REG_DATE 链接到HISTORY 表中的SEMESTER

    【讨论】:

    • 你的意思是,我需要添加where course, history, registration r, discipline?
    • 我不确定你的意思{where course, history, registration r, discipline}
    • 顺便说一句,您知道我如何根据学生的出生日期(当然,使用 oracle)发现学生是否已经成年?
    • 您可以使用这样的查询来确定学生的年龄:SELECT birth_date, TRUNC (MONTHS_BETWEEN (SYSDATE, birth_date) / 12) AS age FROM student;
    • 我尝试比较“年龄”以查看它是否 >= 18,但它告诉我年龄是无效的标识符。这是为什么呢?
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2011-01-10
    • 2021-05-09
    • 2020-10-19
    相关资源
    最近更新 更多