2017-04-21 37 views
0

以下查詢返回一個等級表。 我想要它的總和,我不知道如何做到這一點。計算使用order by和limit的查詢的總和Postgres

SELECT grade 
FROM "GradesTable" 
WHERE status='success' AND student_ID=1 
ORDER BY grade DESC 
LIMIT 50 

我得到這個錯誤:

ERROR: column "grade" must appear in the GROUP BY clause or be used in an aggregate function

+0

的錯誤,我收到來自該查詢:SELECT SUM(級)FROM 「GradesTable」 WHERE狀態= '成功' 和student_id數據= 1 ORDER BY級DESC LIMIT 50 –

+2

你已經顯示的查詢將不會** * *產生該錯誤。請[編輯]你的問題,並添加真正的查詢。請勿在評論中張貼代碼或其他信息 –

+0

@a_horse_with_no_name不正確,請參閱'ORDER BY'。這是我第一次認爲你對與PostgreSQL切線相關的東西是錯誤的。 –

回答

0
SELECT SUM(grades) 
FROM 
(
SELECT grade as grades 
FROM "GradesTable" 
WHERE status='success' AND student_ID=1 
ORDER BY grade DESC 
LIMIT 50 
) z 
+1

請考慮添加一個解釋,爲什麼這是正確的答案。僅有代碼的答案不會教育讀者。 –

0

這裏的問題是ORDER BY條款,如果您粘貼完整的錯誤,而不是迫使我們重新從頭開始你的問題,你就知道因爲你沒有提供DDL和數據。

CREATE TABLE "GradesTable" (status text, student_id int, grade int); 
INSERT INTO "GradesTable" (status, student_id, grade) VALUES 
    ('success', 1, 80), 
    ('success', 1, 100); 

查詢

SELECT sum(grade)             FROM "GradesTable" 
WHERE status='success' AND student_ID=1 
ORDER BY grade DESC 
LIMIT 50 
; 
ERROR: column "GradesTable.grade" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 4: ORDER BY grade DESC 

但是這個作品,

SELECT sum(grade) 
FROM "GradesTable" 
WHERE status='success' AND student_ID=1 
LIMIT 50 
; 
sum 
----- 
180 
(1 row) 

但你不應該有一個LIMIT如果你只有那永遠只能返回一行一個AGG。

SELECT sum(grade) 
FROM "GradesTable" 
WHERE status='success' AND student_ID=1 
; 

如果你的意思是通過sum(grade)命令,你可以這樣做,但你不可能grade訂購您聚合一起第二的能力。然而,在這個例子中,它並不重要,因爲你只返回一行。

作爲一個單獨的說明,你不應該在PostgreSQL中引用標識符。使所有內容小寫,不要引用表名或列名。