Получив наименьшую оценку учащимся, как бы мне построить этот запрос?

Я хотел бы получить некоторую помощь в этом, поскольку я пытался изучить подзапросы, но я все еще борюсь с более "сложными" битами.

Вот образец с тремя таблицами.

dbo.Teacher
StaffID | FirstName | LastName

dbo.Modules
StaffID | ModuleID | ModuleDesc

dbo.StudentModule
ModuleID | OverallMark

Очевидно, что строк больше, но это все, что относится к моему вопросу.

Теперь мне нужно показать самую низкую оценку, которую дает КАЖДЫЙ учитель на ЛЮБОМ модуле. Таким образом, в основном самый низкий общий балл, данный учителем (в целом) любому ученику, по любому модулю.

И тогда мне нужно отобразить всю информацию так

StaffID | FirstName | LastName | ModuleID | ModuleDesc | OverallMark

Эта связь довольно очевидна (StaffID - StaffID | ModuleID - ModuleID)

SELECT m.ModuleID , 
 m.ModuleDescription , 
 t.FirstName , 
 t.Surname , 
 t.StaffID , 
 (
   SELECT MIN(sm.OverallMark) 
   FROM dbo.StudentModule sm 
   WHERE m.ModuleID = sm.ModuleID AND m.StaffID = t.StaffID
 ) AS OverallMark 
 FROM dbo.Modules m 
 JOIN dbo.Teacher t ON m.StaffID = t.StaffID 
 ORDER BY 
 (
   SELECT MIN(sm.OverallMark) FROM dbo.StudentModule sm WHERE m.ModuleID = 
   sm.ModuleID AND m.StaffID = t.StaffID
 ) ASC

2 ответа

Решение

Попробуй это

SELECT StaffID, FirstName, LastName, ModuleID, ModuleDesc, OverallMark
FROM (
    SELECT t.StaffID, t.FirstName, t.LastName, m.ModuleID, m.ModuleDesc, sm.OverallMark
        , ROW_NUMBER() OVER(PARTITION BY m.StaffID ORDER BY sm.OverallMark) AS TheRank
    FROM Teacher t
    JOIN Modules m ON m.StaffID = t.StaffID
    JOIN StudentModule sm ON sm.ModuleID = m.ModuleID
) a
WHERE TheRank = 1

Попробуй это:

SELECT
    t.FirstName
    , t.LastName
    , MIN( sm.OverallMark ) AS LowestMark
FROM dbo.Teacher t
INNER JOIN dbo.Module m
    ON t.StaffID = m.StaffID
INNER JOIN dbo.StudentModule sm
    ON m.ModuleID = sm.ModuleID
GROUP BY
    t.FirstName, t.LastName
ORDER BY
    t.FirstName, t.LastName;
Другие вопросы по тегам