2013-10-03 213 views
-1

任何人都可以更正此查询吗? 我只是不知道如何使它工作。聚合函数子查询

SELECT ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark,Max(SumOFMarks),Min(SumOFMarks) 
FROM 
(
SELECT ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark,sum(StudentMark)SumOFMarks 
FROM Users 
INNER JOIN UserExams ON Users.UserID = UserExams.UserID 
INNER JOIN Exams ON UserExams.ExamID = Exams.ExamID 
INNER JOIN ClassCourses ON Exams.ClassID = ClassCourses.ClassID AND Exams.CourseID = ClassCourses.CourseID 
WHERE ClassCourses.ClassID=1 
group by ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark    
)AS T 
+1

将来,如果您还发布表格定义和您看到的错误信息,它确实会有所帮助。 –

回答

3

试试这个:

SELECT T.ClassID, 
    T.CourseID, 
    T.MaxMark, 
    Max(SumOFMarks), 
    Min(SumOFMarks) 
FROM 
(
    SELECT ClassCourses.ClassID, 
     ClassCourses.CourseID, 
     ClassCourses.MaxMark, 
     sum(StudentMark) SumOFMarks 
    FROM Users 
    INNER JOIN UserExams ON Users.UserID = UserExams.UserID 
    INNER JOIN Exams ON UserExams.ExamID = Exams.ExamID 
    INNER JOIN ClassCourses ON Exams.ClassID = ClassCourses.ClassID AND Exams.CourseID = ClassCourses.CourseID 
    WHERE ClassCourses.ClassID=1 
    group by ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark    
)AS T 
GROUP BY T.ClassID, 
    T.CourseID, 
    T.MaxMark 

外SELECT语句缺少GROUP BY条款 - 我已经添加它。看最后3行。

+1

ClassCourses是内部查询表的别名。 –

+0

yep刚刚注意到 –

1

在刚刚结束GROUP BY和修复表别名:

SELECT T.ClassID, 
     T.CourseID, 
     T.MaxMark, 
     MAX(T.SumOFMarks), 
     MIN(T.SumOFMarks) 
FROM 
(
SELECT ClassCourses.ClassID, 
     ClassCourses.CourseID, 
     ClassCourses.MaxMark, 
     SUM(StudentMark) SumOFMarks 
FROM Users 
INNER JOIN UserExams ON Users.UserID = UserExams.UserID 
INNER JOIN Exams ON UserExams.ExamID = Exams.ExamID 
INNER JOIN ClassCourses ON Exams.ClassID = ClassCourses.ClassID AND Exams.CourseID = ClassCourses.CourseID 
WHERE ClassCourses.ClassID = 1 
GROUP BY ClassCourses.ClassID, 
     ClassCourses.CourseID, 
     ClassCourses.MaxMark    
)AS T 
GROUP BY ClassID,CourseID,MaxMark 
+0

+1。 –

0

你的别名是错误的外部查询。我删除了ClassCourses并添加了T。

SELECT T.ClassID,T.CourseID,T.MaxMark,Max(T.SumOFMarks),Min(T.SumOFMarks) 
FROM 
(
SELECT  
ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark,sum(StudentMark)SumOFMarks 
FROM Users 
INNER JOIN 
    UserExams 
    ON Users.UserID = UserExams.UserID 
INNER JOIN Exams 
    ON UserExams.ExamID = Exams.ExamID 
INNER JOIN ClassCourses 
    ON Exams.ClassID = ClassCourses.ClassID 
    AND Exams.CourseID = ClassCourses.CourseID 
WHERE ClassCourses.ClassID=1 
group by ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark    
)AS T 
GROUP BY T.ClassID,T.CourseID,T.MaxMark; 
+0

错过最终的GROUP BY。 –

+0

添加了group by子句。 – Teja

0

您可以使用CTE这样的:

WITH CteUsers (ClassID, CourseID, MaxMark, SumOFMarks) 
AS (
    SELECT ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark,sum(StudentMark)SumOFMarks 
    FROM Users 
    INNER JOIN UserExams ON Users.UserID = UserExams.UserID 
    INNER JOIN Exams ON UserExams.ExamID = Exams.ExamID 
    INNER JOIN ClassCourses ON Exams.ClassID = ClassCourses.ClassID AND Exams.CourseID = ClassCourses.CourseID 
    WHERE ClassCourses.ClassID=1 
    group by ClassCourses.ClassID,ClassCourses.CourseID,ClassCourses.MaxMark    
) 
SELECT ClassID,CourseID,MaxMark,Max(SumOFMarks),Min(SumOFMarks) 
FROM CteUsers 
GROUP BY ClassID,CourseID,MaxMark 
3

即使在外部查询别名&集团通过更正,仅供参考最大值(T.SumOfMarks)和Min(T.SumOfMarks)会产生相同的值。

+0

你是对的。也许一个如何解决这个问题的例子可能会让你的答案被接受! –

+0

Duh,当然。不能相信我们都错过了:) –