Вернуть только тех сотрудников, которые старше 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

В качестве альтернативы вы можете обойти переменную и вместо этого просто разместить подзапрос, хотя переменная лучше.

Другие вопросы по тегам