Вернуть только тех сотрудников, которые старше 25 лет из последнего периода оплаты
У меня есть этот запрос, где я хочу, чтобы сотрудники только с самым последним RunID и ГДЕ им было больше 25. Как вы можете видеть из моих результатов, он возвращает сотрудников старше 25 лет и ИХ самый последний RunID. Я хочу только сотрудников с последнего RunID(2131). На следующей неделе RunID будет (2132) и будет увеличиваться каждую неделю. Есть ли способ получить сотрудников только по последнему RunID? Действительно застрял на этом. Вот картинка из моего запроса.
SELECT DISTINCT
ed.EeID,
CONCAT(ed.Forename, '', ed.Surname) AS 'Name',
MAX(pr.RunID)
FROM EeDetails ed
INNER JOIN EeRunBals erb on erb.EeID = ed.EeID
INNER JOIN PayrollRuns pr on pr.RunID = erb.RunID
WHERE ed.BirthDate < '1994-01-01'
--WHERE pr.RunID = MAX(pr.RunID)
GROUP BY ed.EeID, ed.Forename, ed.Surname, ed.BirthDate
ORDER BY ed.EeId
3 ответа
Вы можете использовать предложение, имеющееся для фильтрации агрегированного значения, то есть max runid. Также вам нужно использовать подзапрос, чтобы получить максимальный runid, потому что в родительском запросе MAX(pr.RunID)
на самом деле максимальный runid сотрудника (сгруппированного по), а не всех сотрудников. В вашем коде вы можете использовать запрос следующим образом:
SELECT DISTINCT
ed.EeID,
CONCAT(ed.Forename, '', ed.Surname) AS 'Name',
MAX(pr.RunID)
FROM EeDetails ed
INNER JOIN EeRunBals erb on erb.EeID = ed.EeID
INNER JOIN PayrollRuns pr on pr.RunID = erb.RunID
WHERE ed.BirthDate < '1994-01-01'
GROUP BY ed.EeID, ed.Forename, ed.Surname, ed.BirthDate
HAVING MAX(pr.RunID)=(select MAX(RunID) from PayrollRuns)
ORDER BY ed.EeId
Надеюсь это поможет.
Как насчет использования агрегации?
SELECT ed.EeID, ed.Forename, ed.Surname, ed.BirthDate, MAX(pr.RunId)
FROM EeDetails ed INNER JOIN
EeRunBals erb
ON erb.EeID = ed.EeID INNER JOIN
PayrollRuns pr
ON pr.RunID = erb.RunID
WHERE ed.BirthDate < '1994-01-01'
GROUP BY ed.EeID, ed.Forename, ed.Surname, ed.BirthDate
ORDER BY ed.EeId;
О, я вижу, вы не хотите, чтобы последний запуск идентификатора на человека. Вы хотите последний в целом. В таком случае:
SELECT TOP (1) WITH TIES . . .
FROM EeDetails ed INNER JOIN
EeRunBals erb
ON erb.EeID = ed.EeID INNER JOIN
PayrollRuns pr
ON pr.RunID = erb.RunID
WHERE ed.BirthDate < '1994-01-01'
ORDER BY pr.RunId DESC;
Это на самом деле получает идентификатор последнего запуска с кем-то, чья дата рождения меньше '1994-01-01'
,
Ты можешь использовать:
DECLARE @MaxRunID = (select MAX(RunID) from PayrollRuns)
SELECT DISTINCT
ed.EeID,
CONCAT(ed.Forename, '', ed.Surname) AS 'Name',
MAX(pr.RunID)
FROM EeDetails ed
INNER JOIN EeRunBals erb on erb.EeID = ed.EeID
INNER JOIN PayrollRuns pr on pr.RunID = erb.RunID
WHERE ed.BirthDate < '1994-01-01'
AND pr.RunID = @MaxRunID
GROUP BY ed.EeID, ed.Forename, ed.Surname, ed.BirthDate
ORDER BY ed.EeId
В качестве альтернативы вы можете обойти переменную и вместо этого просто разместить подзапрос, хотя переменная лучше.