Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-不将指定的表达式作为聚合函数包含_Sql_Ms Access - Fatal编程技术网

SQL-不将指定的表达式作为聚合函数包含

SQL-不将指定的表达式作为聚合函数包含,sql,ms-access,Sql,Ms Access,我正在尝试编写一个查询,它将计算并列出学生的GPA,然后只显示低于所有学生平均GPA的学生。我已经成功地让查询输出一个表,其中包含每个学生的GPA,但我无法让它只显示低于平均水平的学生 以下是我当前的查询: SELECT SC.StudentID, S.StdLastName, GPA FROM (SELECT SC.StudentID, S.StdLastName, ROUND(SUM(C.Credits * GV.GradeValue)/SUM(C.Credits), 2)

我正在尝试编写一个查询,它将计算并列出学生的GPA,然后只显示低于所有学生平均GPA的学生。我已经成功地让查询输出一个表,其中包含每个学生的GPA,但我无法让它只显示低于平均水平的学生

以下是我当前的查询:

    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;
当我这样做时,出现的错误是

您试图执行的查询不包括作为聚合函数一部分的指定表达式GPA
我在这个网站上发现了多个类似错误的页面,但仍然无法让它正常工作。任何帮助都将不胜感激。

这能消除错误吗?如果有,您可以从下面的列表中选择sid、lname和GPA

  SELECT SC.StudentID, S.StdLastName, GPA, avg(GPA) as avgGPA
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)
WHERE GPA < avg(GPA)
GROUP BY SC.StudentID, S.StdLastName, GPA
    ORDER BY GPA;
当您说groupby SC.StudentID、S.StdLastName、GPA时,您告诉数据库使用这三列创建数据组,然后在本例中对每个组应用聚合函数AVG。这意味着,正如所写的,你试图根据每个学生的平均成绩过滤每个学生的平均成绩。希望每个学生的平均GPA等于他们的实际GPA

为了实现这一点,您需要第二个子查询,您可以使用它来获得总体平均GPA:

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 sc
              INNER JOIN gradevalues gv
                 ON sc.grade = gv.grade)
              INNER JOIN students s
                 ON sc.studentid = s.studentid)
        GROUP BY sc.studentid, s.stdlastname)
GROUP BY sc.studentid, s.stdlastname, gpa
WHERE gpa < (SELECT AVG(GPA) as avg_gpa 
               FROM (SELECT ROUND(SUM(c.credits * gv.gradevalue) / SUM(c.credits), 2) AS gpa
                     FROM  student_classes sc
                           INNER JOIN gradevalues gv
                                   ON sc.grade = gv.grade
                     GROUP BY sc.studentid))
ORDER BY gpa;

我不确定这是否能解决您的语法问题,但它应该能解决您的逻辑问题。

您能确认您使用的是什么数据库吗?这在MySQL语法中并不常见,主要是因为缺少派生表别名和附加的括号。看起来像是MS Access。@bluefeet是的,对不起。把mySQL搞错了。这是在MS Access中。感谢您的确认,我想确保您找到了正确的人来查看问题:这个查询有一个基本问题:GROUPBY GPA将导致AVGGPA始终等于GPA。我怀疑错误是因为您试图在其中一个分组列上使用聚合函数。@Allan我不确定我是否理解。如果我没有将GPA包含在GROUP BY中,我会得到一个错误,因为SELECT中任何不是函数的内容都需要包含在GROUP BY中,否?我之前尝试过。表示WHERE子句中不能有聚合函数。所以我试着喝威士忌。不管怎样,我很感激喝苏格兰威士忌的时间。谢谢,嗯。是的,有一些问题,但我明白要点。我试试看。谢谢,太好了。通过一些小的编辑,这就成功了。非常感谢艾伦。