Вернуть только тех сотрудников, которые старше 25 лет из последнего периода оплаты - PullRequest
0 голосов
/ 16 октября 2018

У меня есть этот запрос, где я хочу, чтобы сотрудники только с самым последним RunID и ГДЕ им было больше 25. Как вы можете видеть из моих результатов, возвращаются сотрудники, которым за 25, и ИХ самый последний RunID.Я хочу только сотрудников с последнего RunID (2131).На следующей неделе RunID будет (2132) и будет увеличиваться каждую неделю.Есть ли способ получить сотрудников только по последнему RunID?Действительно застрял на этом.Вот картинка из моего запроса. imageenter image description here">

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 ]

0 голосов
/ 16 октября 2018

Вы можете использовать:

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

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

0 голосов
/ 16 октября 2018

Вы можете использовать предложение has для фильтрации агрегированного значения, то есть 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

Надеюсь, это поможет.

0 голосов
/ 16 октября 2018

Как насчет использования агрегации?

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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...