计算使用order by和限制Postgres的查询的总和

时间:2017-04-21 15:24:03

标签: sql postgresql aggregate-functions

以下查询返回成绩表。 我想要它的总和,我不知道该怎么做。

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

我收到此错误:

  

错误:专栏"等级"必须出现在GROUP BY子句中或使用   在一个聚合函数

2 个答案:

答案 0 :(得分: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

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

如果你打算按sum(grade)订购,那么你就可以做到这一点,但是在你将第二次聚合在一起的grade时,你就失去了订购的能力。但是,在这个示例中,它并不重要,因为您只返回一行。

作为一个单独的注释,你永远不应该在PostgreSQL中引用标识符。将所有内容都设为小写,不要引用表名或列名。