使用avg列创建视图

时间:2013-05-09 11:21:58

标签: oracle

我需要创建一个视图VIEW UOS_VU_STUDENT_AVERAGE,其中一个列requries平均GRADE,SQL:

CREATE VIEW UOS_VU_STUDENT_AVERAGE AS
SELECT STUDENT.FIRST_NAME, STUDENT.LAST_NAME, STUDENT_MODULE.GRADE
FROM STUDENT, STUDENT_MODULE
WHERE STUDENT_ID<120000001 

我怎么能在这个sql中平均成绩?

3 个答案:

答案 0 :(得分:1)

CREATE VIEW UOS_VU_STUDENT_AVERAGE AS
SELECT STUDENT.FIRST_NAME, STUDENT.LAST_NAME, avg(STUDENT_MODULE.GRADE)
FROM STUDENT, STUDENT_MODULE
WHERE STUDENT_ID<120000001 
group by STUDENT.FIRST_NAME, STUDENT.LAST_NAME

作为zerkms评论说,没有连接条件,你可能需要这样的东西:

CREATE VIEW UOS_VU_STUDENT_AVERAGE AS
SELECT STUDENT.FIRST_NAME, STUDENT.LAST_NAME, avg(STUDENT_MODULE.GRADE)
FROM STUDENT join STUDENT_MODULE on student_module.STUDENT_ID = student.id
WHERE STUDENT_ID<120000001 
group by STUDENT.FIRST_NAME, STUDENT.LAST_NAME

(我只是猜测FK在student_module.STUDENT_ID = student.id

答案 1 :(得分:0)

您必须使用“分组依据”来表示任何数学函数,例如

AVG ( [ ALL | DISTINCT ] expression )

例如..

SELECT id, AVG(salary) from tablename GROUP BY filedname

答案 2 :(得分:0)

您需要执行以下操作。我对表格的结构做了一些假设。

CREATE VIEW uos_vu_student_average AS
SELECT first_name, last_name,  AVG(grade) avg_grade
  FROM student, student_module
 WHERE student.student_id = student_module.student_id
   AND student.student_id < 120000001
 GROUP BY first_name, last_name;

在您的示例中,正如之前的海报所指出的那样,您在原始示例中没有加入,因此无论student_id如何,它都会将所有成绩平均在一起。结果将显示每个人具有相同的平均成绩。

在视图中执行聚合函数时,还需要为结果列指定别名,以便在对视图执行DML时以某种方式引用它。在这种情况下,我将其分配给avg_grade。