Получите ли вы то, что хотите, используя выражение поля (B.Hours + C.Hours) в подзапросе вместо псевдонима TotalHours?
Select A.PName, (B.Hours+C.Hours) as TotalHours,
(select top 1 grade from TableD where TableD.HoursRequire >= (B.Hours+C.Hours))
from TableA A
left join TableB B on A.Pname=B.Pname
left join TableC C on A.Pname=C.Pname
Однако, если вы используете левые объединения, и я подозреваю, что для строк, в которых B.Hours или C.Hours равно Null, вы ничего не получите из подзапроса, поскольку B.Hours + C.Hours будут равны Null и TableD.HoursRequire >= Null
никогда не будет оцениваться как True. Здесь может быть полезна функция Nz ().
Редактировать: @cyberwiki находится на Re Top 1 без ORDER BY. Извините, что пропустил это.
Почему у вас есть часы, разделенные на 2 таблицы (TableB и TableC)? Покажите нам пример данных из этих таблиц.
Edit2: Если нецелесообразно объединять часы в одну физическую таблицу, вы все равно можете сделать это с «виртуальной» таблицей, используя запрос Union.
Сохраните это как qryUnionHours:
SELECT Pname, Hours
FROM TableB
UNION ALL
SELECT Pname, Hours
FROM TableC;
Затем вы можете использовать qryUnionHours в качестве источника данных для запроса GROUP BY, qryHoursPerPerson, который суммирует часы для каждого человека.
SELECT Pname, Sum(Hours) AS TotalHours
FROM qryUnionHours
GROUP BY Pname;
На самом деле вы можете предпочесть один запрос, который включает в себя SQL из qryUnionHours в качестве подзапроса. Я сделал это с 2, потому что я думал, что это может быть проще для понимания и менее подвержены синтаксическим ошибкам. Все, что вам нужно сделать, это интегрировать ваши оценки, как мы обсуждали в другой ветке.