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 を (科目の最終評点として) 1 つ持っていた場合、その平均値に関係なく、文字列には「the student failed」が含まれている必要があります。最終学年が 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