2013-05-04 59 views
1

我有下面列的表格学生:SQL:选择所有科目平均成绩的一个学生和打印根据消息

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 | 

在我的程序我通过学生证(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); 

请帮忙

回答

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 
+0

非常感谢!我现在怎么才能在avg_grade列中访问这个唯一的值? (我需要声明一个字符串,并根据平均等级覆盖它的内容)。如果我使用select,它将返回一个列表... – IAM 2013-05-04 17:15:19

+0

你想做什么?你使用的是什么RDBMS? – 2013-05-04 17:18:12

+0

我使用的是Oracle数据库11g企业版。我现在需要做什么,以保存关于学生成功的信息。最高分为1分,最低分为5分。 如果学生有一个单独的5(作为学科的最后一个分数),不管他有多少平均分,字符串应该包含“学生失败”,如果学生有没有5作为最后一个年级,平均<= 1,5,字符串应该包含“完美平均数”,否则只是“学生通过” – IAM 2013-05-04 17:24:26