1

我有一个表学生,其中包含以下列:

id  subject  grade   date
---|-------|------|-----------|
1  | A     |  1   | 01-MAR-10 | 
1  | A     |  5   | 05-APR-10 | 
1  | B     |  3   | 01-JUN-10 | 
2  | A     |  1   | 01-MAR-10 | 
2  | C     |  3   | 01-APR-10 | 

在我的程序中,我传递了学生 ID(p_id),并且我需要为该学生选择所有科目的平均成绩,如果一个学生对同一科目有 2 个成绩,则只计算最新的成绩,如下所示:

对于 p_id=1:

id  avgGrade
---|--------|
1  | 4      |

这已经完成了

我现在需要做的是,将有关学生成功的信息保存在字符串中并使用 DBMS_OUTPUT 打印出来。最高分是1分,最低分是5分。如果一个学生只有一个5分(作为一门学科的最后一个分数),不管他的平均分是多少,字符串应该包含“学生不及格”,如果学生没有5 作为最后一个年级,平均 <= 1,5 ,字符串应该包含“完美平均”,否则只是“学生通过”

到目前为止的代码是:

    CREATE OR REPLACE Procedure avg_grade
   ( p_id IN number )

IS

   cursor c1 is
   select a.id, avg(a.grade) avg_grade
   from student a
   inner join 
   (
    select id, subject, max(date) max_date
    from student
    where id=p_id
    group by id, subject
   )b ON a.id=b.id and
      a.subject=b.subject and
      a.date=b.max_date
where a.id=p_id
group by id;

cursor c2 is
select grade
from student
where id=p_id;

DECLARE @out as varchar(50)
SET @out=NULL

IF c2.grade IN(5)
BEGIN
SET @out='student failed'
END

ELSE IF c2.grade NOT IN(5) AND c1.avg_grade IN (BETWEEN 1 AND 1,5)
BEGIN
SET @out='student has a perfect average'
END

ELSE 
BEGIN
SET @out='student passed'
END

DBMS_OUTPUT.PUT_LINE(@out);

请帮忙

4

1 回答 1

1
SELECT  a.ID, AVG(a.grade) AVG_GRADE
FROM    TableName a
        INNER JOIN
        (
            SELECT  ID, Subject, MAX(date) max_date
            FROM    TableName
            WHERE   ID = 1            -- <<== change it to p_id
            GROUP   BY ID, Subject
        ) b ON  a.ID = b.ID AND
                a.Subject = b.Subject AND
                a.date = b.max_date
WHERE   a.ID = 1                      -- <<==  change it to p_id
GROUP   BY a.ID
于 2013-05-04T16:59:10.237 回答