Как получить среднее значение вложенного запроса, возвращенного как один результат, на основе родительского запроса - PullRequest
0 голосов
/ 11 октября 2011

Вот еще одна проблема, с которой мне приходилось сталкиваться в последние пару дней.У меня есть следующий запрос:

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 Ответ

1 голос
/ 11 октября 2011

Вы можете попробовать следующий запрос:

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
...