2013-05-04 45 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