2011-10-11 68 views
0

这是我在过去几天中必须处理的另一个问题。我有以下查询:如何根据父查询返回作为单个结果返回的嵌套查询的平均值

SELECT S.Name,S.Surname,S.Student_ID,S.StudentNumber,C.Course, B.Campus_Title,M.Module,SM.Percentage_Obtained,S.Days_Absent 
FROM Students S 
INNER JOIN Student_Courses SC 
ON SC.StudentID = S.ID 
INNER JOIN Courses_Template C 
ON C.ID = SC.courseID 
INNER JOIN Branches B 
ON B.ID = S.BranchID 
INNER JOIN Student_Modules SM ON 
SM.StudentID =S.ID 
INNER JOIN Modules_Template M ON 
M.ID = SM.ModuleID 

的问题是,我想重写查询来获得这样的计算结果:

SELECT S.Name,S.Surname,S.Student_ID,S.StudentNumber,C.Course, B.Campus_Title,M.Module,SM.Percentage_Obtained,S.Days_Absent, 
     (SELECT AVG(Percentage_Obtained) 
     FROM Student_Modules 
     INNER JOIN Courses_Template 
     ON Courses_Template.ID = Student_Modules.CourseID 
     INNER JOIN Modules_Template 
     ON Courses_Template.ID = Modules_Template.CourseID 
     WHERE Modules_Template.Module= M.Module)[AS Class Average] 
FROM Students S 
INNER JOIN Student_Courses SC 
ON SC.StudentID = S.ID 
INNER JOIN Courses_Template C 
ON C.ID = SC.courseID 
INNER JOIN Branches B 
ON B.ID = S.BranchID 
INNER JOIN Student_Modules SM ON 
SM.StudentID =S.ID 
INNER JOIN Modules_Template M ON 
M.ID = SM.ModuleID 

用于模块的初始值是(提取)

M.Modules AVG(Percentage_Obtained) 

Module 1 99 
Module 2 98 
Module 3 94 
Module 1 94 
Module 2 22 
Module 3 100 

,我从第二个查询想预期的结果是这样的

M.Modules AVG(Percentage_Obtained) (SubQuery's Average) 
Module 1 99       97 
Module 2 98       60 
Module 3 94       96 
Module 1 94       97 
Module 2 22       60 
Module 3 100       96 

然而,它给我的是完全不同的东西

,我从第二个查询想要的是这个

M.Modules AVG(Percentage_Obtained) (SubQuery's Average) 
Module 1 99       84 
Module 2 98       84 
Module 3 94       84 
Module 1 94       84 
Module 2 22       84 
Module 3 100       84 

任何人都可以或许从某处发现我的错误了预期的效果?我需要在单个查询中使用所有这些字段,因为我必须对其进行报告。子查询的结果是至关重要的

它几乎就像我需要这个(但动态的模块的所有复发):

SELECT AVG(Percentage_Obtained) 
FROM Student_Modules 
INNER JOIN Modules_Template ON Modules_Template.ID = Student_Modules.ModuleID 
WHERE Modules_Template.Module = 'Module 1' -- And module 2, and module 3 .... but Dynamically 

回答

1

你可以试试下面的查询:

SELECT S.Name,S.Surname,S.Student_ID,S.StudentNumber,C.Course, B.Campus_Title,M.Module,SM.Percentage_Obtained,S.Days_Absent, SM2.AvgPercentage_Obtained 
FROM Students S 
INNER JOIN Student_Courses SC 
ON SC.StudentID = S.ID 
INNER JOIN Courses_Template C 
ON C.ID = SC.courseID 
INNER JOIN Branches B 
ON B.ID = S.BranchID 
INNER JOIN Student_Modules SM ON 
SM.StudentID =S.ID 
INNER JOIN Modules_Template M ON 
M.ID = SM.ModuleID 
OUTER APPLY (SELECT AVG(Percentage_Obtained) AvgPercentage_Obtained 
      FROM Student_Modules 
      INNER JOIN Modules_Template ON Modules_Template.ID = Student_Modules.ModuleID 
      WHERE Student_Modules.Module = M.Module) SM2 
+0

如果我能我会亲吻你! 非常感谢。你用那个救了我的皮。要研究外部应用尽快,不知道它 – Eon

+0

@EonRustedduPlessis - 有没有必要这样做;-)。我很高兴答案奏效。 – Lamak

+0

它运作良好。只是,WHERE的最后一行Student_Modules.Module = M.Module应该是WHERE Student_Modules.ModuleID = M.ID – Eon