PL / SQL游标可以找到所有具有两个以上学生的班级,其考试成绩超过其课堂平均分数的90%?

时间:2013-05-02 16:05:38

标签: sql oracle plsql

我在努力为学生人数获得正确的价值时遇到了问题。我需要使用游标,我的程序的输出应该是这样的......我希望能够从正确的方向前往这里,因为我有点困惑。谢谢!

Class Name    Number of Students
=================================
Biology                        6
Calc                           3
German                         5

这是我目前的代码:

DECLARE
        CURSOR c_1 IS
            SELECT c.class_name, AVG(s.grade)
            FROM   class c, student s
                WHERE  c.class_id = s.class_id
            GROUP BY class_name
                ORDER BY class_name;

        grade_rec c_1%ROWTYPE;

BEGIN
      DBMS_OUTPUT.PUT_LINE(('Class Name') || '    ' || ('NUMBER OF Students'));
      DBMS_OUTPUT.PUT_LINE('--------------------------------------');
      FOR grade_rec IN c_1 LOOP
       DBMS_OUTPUT.PUT_LINE(rpad(grade_rec.class_name, 15) || 
        '             ' || lpad(grade_rec.avg_grade, 10));
    END LOOP;
END;

1 个答案:

答案 0 :(得分:0)

这有点棘手。但您可以使用HAVING按结果与组进行比较。

您的选择会按类别为您提供平均值。现在你需要计算一个分数高于平均分的学生人数。

    select class_name, count(*) from student s2, 
        (SELECT c.class_name, class_id, AVG(s.grade) avgg
        FROM   class c, student s
            WHERE  c.class_id = s.class_id
        GROUP BY class_name, class_id) avg
      where avg.class_id = s2.class_id
        and s2.grade > avg.avgg  
    group by class_name
    having count(*) > 2

我还没有对它进行过测试,但它会创建一个按类别划分的子查询。然后你再次加入学生,但只有那些平均成绩更高的学生。最后,使用having子句来比较计数。