SQL - Ne comprend Pas L'Expression Spécifiée comme une Fonction d'Agrégation
Je suis d'essayer d'écrire une requête qui calcule et de la liste de l'étudiant à l'AMP et puis n'affiche que ceux qui sont en dessous de la moyenne moyenne pondérée de tous les élèves. J'ai obtenu avec succès la requête à la sortie d'une table avec la moyenne de chaque étudiant, mais je ne peux pas l'obtenir pour n'afficher que ceux en dessous de la moyenne.
Voici ma requête:
SELECT SC.StudentID, S.StdLastName, GPA
FROM (SELECT SC.StudentID, S.StdLastName, ROUND(SUM(C.Credits * GV.GradeValue)/SUM(C.Credits), 2) AS GPA
FROM ((Student_Classes AS SC INNER JOIN GradeValues AS GV ON SC.Grade = GV.Grade)
INNER JOIN Students AS S ON SC.StudentID = S.StudentID)
INNER JOIN Classes as C ON SC.ClassID = C.ClassID
GROUP BY SC.StudentID, S.StdLastName)
GROUP BY SC.StudentID, S.StdLastName, GPA
HAVING GPA < AVG(GPA)
ORDER BY GPA;
Quand je fais cela, le message d'erreur qui s'affiche est,
Vous avez essayé d'exécuter une requête qui ne comprennent pas l'expression spécifiée GPA < AVG(GPA) dans le cadre d'une fonction d'agrégation.
J'ai trouvé plusieurs pages sur une erreur similaire sur ce site, mais n'ont toujours pas été en mesure de le faire fonctionner. Toute aide serait grandement appréciée.
- Pouvez-vous confirmer que la base de données que vous utilisez? Qui n'apparaît pas à la syntaxe de MySQL, principalement en raison de l'absence de dérivés de l'alias de table et les nouvelles parenthèses. Il ressemble à MS Access.
- Ouais désolé. Mettre mySQL par erreur. C'est dans MS Access.
- Merci pour la confirmation, je veux être sûr que vous obtenez les bonnes personnes à la recherche à la question. 🙂
- Vous avez un problème de base avec cette requête:
group by GPA
entraîneraAVG(GPA)
toujours être égal àGPA
. Je crois que l'erreur est parce que vous essayez d'utiliser une fonction d'agrégation sur une des colonnes de regroupement. - Je ne suis pas sûr de comprendre. Si je ne comprend pas l'AMP dans le GROUPE, j'obtiens une erreur, car rien dans SÉLECTIONNEZ ce n'est pas une fonction doit être dans le GROUPE PAR la, non?
- C'est correct. Vous ne pouvez pas utiliser la moyenne de
GPA
et laGPA
de chaque ligne lorsque vous les obtenir à partir du même jeu de résultats. Je vais essayer d'illustrer le problème dans une réponse un peu plus tard. - Hmm. Alright. Je vais continuer à jouer avec elle, mais je me réjouis de votre prendre.
Vous devez vous connecter pour publier un commentaire.
Quand vous dites
GROUP BY SC.StudentID, S.StdLastName, GPA
, vous dites à la base de données pour l'utilisation de ces trois colonnes pour créer des groupes de données, puis appliquer la fonction d'agrégation (dans ce casAVG
) dans chaque groupe. Cela signifie que, comme l'écrit, vous êtes en essayant de filtre à chaque élève de GPA à l'encontre de l'étudiant moyen. Espérons-le, de chaque élève en moyenne GPA est égale à leur GPA...Pour faire ce travail, vous avez besoin d'un deuxième sous-requête, que vous pouvez utiliser pour obtenir la moyenne globale de GPA:
Je ne suis pas sûr si cela va résoudre votre problème de syntaxe, mais il devrait résoudre votre problème de logique.
Est-ce à se débarrasser de l'erreur? Si c'est le cas, vous pouvez simplement sélectionner le sid, lname, la moyenne générale DE cette