2012-05-04 165 views
3

我有一個表"Register"如何計算平均成績爲每個學生

與列:

class_id bigint NOT NULL, 
    disciple text, 
    datelesson date NOT NULL, 
    student_id integer NOT NULL, 
    note character varying(2) 

現在我要計算每個student_id數據的平均分數和缺席

Select * from "Register" as m 

Join 

(SELECT AVG(average), COUNT(abs) FROM (SELECT 
    CASE 
     WHEN "note" ~ '[0-9]' THEN CAST("note" AS decimal) 
    END AS average, 
    CASE 
     WHEN "note" ='a' THEN "note" 
    END AS abs 
FROM "Register") AS average)n 
on class_id=0001 
And datelesson between '01.01.2012' And '06.06.2012' 
And discipline='music' order by student_id 

結果是這樣的:

0001;"music";"2012-05-02";101;"6";7.6666666666666667;1 
0001;"music";"2012-05-03";101;"a";7.6666666666666667;1 
0001;"music";"2012-05-01";101;"10";7.6666666666666667;1 
0001;"music";"2012-05-02";102;"7";7.6666666666666667;1 
0001;"music";"2012-05-03";102;"";7.6666666666666667;1 
0001;"music";"2012-05-01";102;"";7.6666666666666667;1 

我收到的結果是整列,但是如何計算每個學生的平均分數?

回答

3

看起來是這樣的:

SELECT student_id 
    , AVG(CASE WHEN note ~ '^[0-9]*$' THEN note::numeric 
             ELSE NULL END) AS average 
    , COUNT(CASE WHEN note = 'a' THEN 1 ELSE NULL END) AS absent 
FROM "Register" 
WHERE class_id = 1 
AND datelesson BETWEEN '2012-01-01' AND '2012-06-06' 
AND discipline = 'music' 
GROUP BY student_id 
ORDER BY student_id; 

我增加了幾個改進。

  • 您不需要對小寫字母標識符加雙引號。
  • 如果你想確定,只有數字note,你的正則表達式必須是類似note ~ '^[0-9]*$'。你只有檢查字符串中是否有任何數字。
  • 對於日期,最好使用ISO格式,與任何區域設置一樣:YYYY-MM-DD
  • count用於缺勤,因爲NULL值不計算。 Ypu也可以使用sum
  • 由於class_id是一個數字類型,因此準確地說,bigint,前導零隻是噪聲。
    使用class_id = 1而不是class_id = 0001
2

在我看來,你錯過了「group by」子句。我對Postgress不熟悉,但我懷疑這個想法也適用。

這裏是在Transact-SQL的例子:

--create table register 
--(
--class_id bigint NOT NULL, 
-- disciple text, 
-- datelesson date NOT NULL, 
-- student_id integer NOT NULL, 
-- grade_report integer not null, 
-- ) 


--drop table register 

delete from register 
go 

insert into register 
    values(1, 'math', '1/1/2011', 1, 1) 
insert into register 
    values(1, 'reading', '1/1/2011', 1, 2) 
insert into register 
    values(1, 'writing', '1/1/2011', 1, 5) 

insert into register 
    values(1, 'math', '1/1/2011', 2, 8) 
insert into register 
    values(1, 'reading', '1/1/2011', 2, 9) 

SELECT student_id, AVG(grade_report) as 'Average', COUNT(*) as 'NumClasses' 
from register 
WHERE class_id=1 
group by student_id 
order by student_id 

歡呼

+2

'go'不是有效的PostgreSQL語句。另外Postgres需要';'來終止一個語句。 –