Получив наименьшую оценку учащимся, как бы мне построить этот запрос?
Я хотел бы получить некоторую помощь в этом, поскольку я пытался изучить подзапросы, но я все еще борюсь с более "сложными" битами.
Вот образец с тремя таблицами.
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;