2017-04-21 2 views
0

La requête suivante renvoie une table de notes. Je veux la somme et je ne sais pas comment faire.Calculer la somme d'une requête qui utilise order by et limit Postgres

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

Je reçois cette erreur:

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

+0

L'erreur que je reçois vient de cette requête: SELECT SUM (grade) FROM "GradesTable" où le statut = 'succès' ET student_ID = 1 ORDER BY qualité DESC LIMIT 50 –

+2

La requête que vous avez montré ** NE * * produire cette erreur. S'il vous plaît [modifier] votre question et ajouter la vraie requête. Ne postez pas de code ou d'informations supplémentaires dans les commentaires –

+0

@a_horse_with_no_name ce n'est pas vrai, voir le 'ORDER BY'. C'est la première fois que je pense que vous avez eu tort à propos de quelque chose, même indirectement, lié à PostgreSQL. –

Répondre

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

Veuillez envisager d'ajouter une explication pour expliquer pourquoi c'est la bonne réponse. Les réponses au code seulement n'ont pas tendance à éduquer les lecteurs. –

0

Le problème ici est la clause ORDER BY que vous savez si vous avez collé l'erreur complète, au lieu de nous forcer à recréer votre problème à partir de zéro parce que vous n'avez pas fourni le DDL et les données.

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

Recherche

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 

Cependant cela fonctionne,

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

Mais vous ne devriez pas avoir un LIMIT si vous avez seulement un agg qui ne peut jamais retourner une ligne.

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

Si vous vouliez commander par sum(grade) vous pouvez le faire, mais vous perdez la possibilité de commander par grade le second vous regroupez ensemble. Cependant, dans cet exemple, cela n'a pas d'importance car vous ne renvoyez qu'une ligne.

Et dans une note séparée, vous ne devriez jamais citer d'identifiants dans PostgreSQL. Faites tout en minuscules, ne citez jamais les noms de tables ou de colonnes.