0

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

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;
4

1 回答 1

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子句来比较计数。

于 2013-05-02T20:07:45.417 回答