Эта строка вызывает ошибку:
and "Candidates"."Confirmed" = (select max("Confirmed")"Confirmed", "SubstituteTeacher"
from dbo."Candidates" group by "SubstituteTeacher")
Прежде всего, не имеет смысла сравнивать одно скалярное значение с записью, имеющей два значения,Но, что еще хуже, подзапрос в RHS, вероятно, возвращает более одной записи.Попробуйте изменить на это:
AND "Candidates"."Confirmed" IN (SELECT MAX("Confirmed") FROM dbo."Candidates"
GROUP BY "SubstituteTeacher")
Вот весь ваш запрос, исправленный с этой проблемой:
SELECT
COUNT(DISTINCT wc.SubstituteTeacher) AS Count,
a.FirstName,
a.LastName,
c.Confirmed,
c.FinalStatus
FROM dbo.Accounts a
LEFT JOIN dbo.WorkContracts wc
ON a.ID = wc.SubstituteTeacher
FULL OUTER JOIN dbo.SubstituteTeacherPeriods s
ON a.ID = s.CreatedBy
FULL OUTER JOIN dbo.Candidates c
ON a.ID = c.ModifiedBy
WHERE
wc.WorkContractType != 3 AND
s.StartTime >= '2018-09-18 00:00:00' AND s.EndTime < '2018-09-19 00:00:00' AND
s.Discriminator = 'AvailabilityPeriod' AND
c.FinalStatus = (SELECT MAX(FinalStatus) FROM dbo.Candidates) AND
c.Confirmed IN (SELECT MAX(Confirmed) FROM dbo.Candidates
GROUP BY SubstituteTeacher)
GROUP BY
a.FirstName,
a.LastName,
c.FinalStatus,
c.Confirmed;
Обратите внимание, что путем введения псевдонимов таблиц и удаления ненужных двойных кавычек везде, запросстановится намного более читабельным.
Если вы хотите, чтобы последняя запись для каждого учителя использовалась в столбце Confirmed
, тогда мы можем использовать ROW_NUMBER
:
WITH cte AS (
SELECT
COUNT(DISTINCT wc.SubstituteTeacher) AS Count,
a.FirstName,
a.LastName,
c.Confirmed,
c.FinalStatus,
ROW_NUMBER() OVER (PARTITION BY a.FirstName, a.LastName ORDER BY Confirmed DESC) rn
FROM dbo.Accounts a
... -- the rest of the above query
)
SELECT
Count,
FirstName,
LastName,
Confirmed,
FinalStatus
FROM cte
WHERE rn = 1;