【问题标题】:column is not contained in aggregate function or group by clause列不包含在聚合函数或 group by 子句中
【发布时间】:2016-03-04 06:45:55
【问题描述】:

我正在尝试通过使用 sum 的查询来选择行。我不断收到错误column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 我将指定的列添加到 group by 子句,它只是转到查询中的下一列。我真的必须将 select 子句中的每一列都添加到 group by 子句吗?

这是我的查询:

SELECT 
   s.studentId, s.firstName, s.lastName, 
   c.courseId, c.courseName, c.semesterId AS courseSemesterId, 
   se.semesterId, se.season, se.year, 
   e.enrollmentId, e.studentId AS enrolledStudentId, e.courseId AS enrolledCourseId, e.semesterId AS enrolledSemesterId,
   a.assignmentId, (sum(a.pointsEarned) / sum(a.pointsPossible)) AS percentage
FROM Students AS s
INNER JOIN Enrollment AS e ON s.studentId = e.studentId
LEFT JOIN Courses AS c ON e.courseId = c.courseId
LEFT JOIN Semesters AS se ON c.semesterId = se.semesterId
LEFT JOIN Assignments AS a ON e.enrollmentId = a.enrollmentId
GROUP BY s.studentId, s.firstName, s.lastName
ORDER BY e.courseId

【问题讨论】:

  • 是的,GROUP BY 子句中的所有列都必须在 SELECT 中,但聚合函数中使用的列除外。
  • 那么您是否希望从assignments 或其中的每一行获取聚合值?因为您的选择列表中实际上有a.assignmentID,这意味着您需要单独的每一行。

标签: sql-server


【解决方案1】:

不一定,如果您使用 SQL Server 2012 或更高版本(我相信),您可以使用 OVER 子句,如下所示:

(sum(a.pointsEarned) OVER (PARTITION BY s.studentId) / 
 sum(a.pointsPossible) OVER (PARTITION BY s.studentId))

msdn文章链接:OVER Clause

【讨论】:

    【解决方案2】:

    像这样试试。

    方法一

    SELECT s.studentId
        ,s.firstName
        ,s.lastName
        ,(sum(a.pointsEarned) / sum(a.pointsPossible)) AS percentage
    FROM Students AS s
    INNER JOIN Enrollment AS e ON s.studentId = e.studentId
    LEFT JOIN Courses AS c ON e.courseId = c.courseId
    LEFT JOIN Semesters AS se ON c.semesterId = se.semesterId
    LEFT JOIN Assignments AS a ON e.enrollmentId = a.enrollmentId
    GROUP BY s.studentId
        ,s.firstName
        ,s.lastName
    ORDER BY e.courseId
    

    方法2(如果您需要选择中的所有列。您应该将其包含在分组依据中)

    SELECT s.studentId
        ,s.firstName
        ,s.lastName
        ,c.courseId
        ,c.courseName
        ,c.semesterId AS courseSemesterId
        ,se.semesterId
        ,se.season
        ,se.year
        ,e.enrollmentId
        ,e.studentId AS enrolledStudentId
        ,e.courseId AS enrolledCourseId
        ,e.semesterId AS enrolledSemesterId
        ,a.assignmentId
        ,(sum(a.pointsEarned) / sum(a.pointsPossible)) AS percentage
    FROM Students AS s
    INNER JOIN Enrollment AS e ON s.studentId = e.studentId
    LEFT JOIN Courses AS c ON e.courseId = c.courseId
    LEFT JOIN Semesters AS se ON c.semesterId = se.semesterId
    LEFT JOIN Assignments AS a ON e.enrollmentId = a.enrollmentId
    GROUP BY s.studentId
        ,s.firstName
        ,s.lastName
        ,c.courseId
        ,c.courseName
        ,c.semesterId
        ,se.semesterId
        ,se.season
        ,se.year
        ,e.enrollmentId
        ,e.studentId
        ,e.courseId
        ,e.semesterId
        ,a.assignmentId
    ORDER BY e.courseId
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      相关资源
      最近更新 更多