2016-03-04 56 views
0

我试图选择具有使用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 
+1

是的,GROUP BY子句中的所有列必须位于SELECT中,但聚合函数中使用的列除外。 –

+0

那么你是否希望从'assignments'或者它的每一行获得聚合值呢?因为你实际上在你的选择列表中有'a.assignmentID',这意味着你需要单独的每一行。 –

回答

0

尝试这样的。

方法-1

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 
1

不一定,如果你使用SQL服务器2012或以上版本(我相信),你可以使用OVER条款,比如:

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

李nk to msdn文章:OVER Clause

相关问题