nb: я предположил, что вы хотите только 25 строк с самым высоким SumOfCeiling_Final
Я предлагаю вам сначала сформировать «производную таблицу», используя union all
, а затем искать строки top n
. Обратите внимание, что having clause
НЕ является заменой where clause
. having clause
необходимо, если условия фильтрации требуют агрегированных значений (например, having sum(cost) > 1000
). Если условия фильтрации не включают агрегаты, поместите их в where clause
.
SELECT TOP 25
*
FROM (
SELECT
tblTasks.Task, tblTasks.Task_Status, tblTasks.Award_Date, tblTasks.End_Date, SUM(tblPRs.Ceiling_Final) AS SumOfCeiling_Final, tblTasks.Program, tblTasks.Prime, tblClient.Org_Top
FROM (tblTasks
INNER JOIN tblClient
ON tblTasks.Task_ID = tblClient.Task_ID)
INNER JOIN tblPRs
ON tblTasks.Task_ID = tblPRs.Task_ID
WHERE tblTasks.Task_Status = "open"
GROUP BY
tblTasks.Task
,tblTasks.Task_Status
,tblTasks.Award_Date
,tblTasks.End_Date
,tblTasks.Program
,tblTasks.Prime
,tblClient.Org_Top
UNION ALL
SELECT
tblTasks.Task, tblTasks.Task_Status, tblTasks.Award_Date, tblTasks.End_Date, SUM(tblPRs.Ceiling_Final) AS SumOfCeiling_Final, tblTasks.Program, tblTasks.Prime, tblClient.Org_Top
FROM (tblTasks
INNER JOIN tblClient
ON tblTasks.Task_ID = tblClient.Task_ID)
INNER JOIN tblPRs
ON tblTasks.Task_ID = tblPRs.Task_ID
WHERE tblTasks.Task_Status = "pending"
GROUP BY
tblTasks.Task
,tblTasks.Task_Status
,tblTasks.Award_Date
,tblTasks.End_Date
,tblTasks.Program
,tblTasks.Prime
,tblClient.Org_Top
) d
ORDER BY
SumOfCeiling_Final DESC
;
NB UNION ALL
НЕ удаляет дублирующиеся строки, UNION
удаляет дублирующиеся строки. Итак, UNION ALL
на самом деле МЕНЬШЕ работает, то есть быстрее. Кроме того, в верхнем запросе все строки должны содержать Task_Status = "open", а в нижнем они должны содержать Task_Status = "pending", чтобы 2 запроса производили строки, которые должны отличаться. Хотя без данных для проверки я не могу быть уверен, похоже, вам нужно всего лишь использовать union all
.