以下查询返回成绩表。 我想要它的总和,我不知道该怎么做。
SELECT grade
FROM "GradesTable"
WHERE status='success' AND student_ID=1
ORDER BY grade DESC
LIMIT 50
我收到此错误:
错误:专栏"等级"必须出现在GROUP BY子句中或使用 在一个聚合函数
答案 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中引用标识符。将所有内容都设为小写,不要引用表名或列名。