Действующие даты из двух разных таблиц, соответствующие записи на определенную дату - PullRequest
2 голосов
/ 02 июля 2019

Я пытаюсь получить записи сотрудников с 01.01.19.Я присоединяю таблицу истории сотрудников к таблице сведений о коде работы.Для каждой записи сотрудника я хочу сопоставить детали кода работы на дату вступления в силу записи сотрудника.Так что, если бы 1/19/19 была запись сотрудника, я хотел бы, чтобы детали кода работы были эффективными в то время;и для этого, чтобы не тянуть в верхней части стека детали кода работы, который, возможно, изменился с 1/2/19.У меня проблемы с правильным кодированием.

Я попробовал приведенный ниже код, но не уверен, что он правильный.Я присоединился к таблице J2 для другого отчета, который я сделал для извлечения записи кода задания вершины стека (т. Е. WHERE J2.EFFDT = NULL).Не уверен, нужно ли что-то подобное использовать для моего текущего запроса, и как это следует включить в инструкцию WHERE.

SELECT
    E.EMPLID AS [EE ID]
    ,E.Name AS [Name]
    ,E.EFFDT AS [Eff Date]
    ,E.COMPANY AS [Co.]
    ,E.JOBCODE AS [Job Code]
    ,E.JOBTITLE [Title]
    ,J.GRADE AS [MRR]
    ,J.BONUS AS [Bonus]
    ,J.OCC_TYPE AS [OCC]
    ,E.EMPL_STATUS_DESC AS [Status]
FROM Employee History AS [E]
LEFT JOIN JobCodeTable AS [J]
    ON E.JOBCODE = J.JOBCODE
LEFT JOIN JobCodeTable AS [J2]
    ON (
        J.JOBCODE = J2.JOBCODE 
        AND 
        J.EFFDT < J2.EFFDT
        )
WHERE E.EMPL_STATUS_DESC = 'Active'
    AND
    E.EFFDT >= '2019-01-01'
    AND
    E.EFFDT >= J.EFFDT

Пример результатов будет ниже.Это тянет все записи сотрудников для Джейн Доу и Джона Смита с 01.01.19.В этом примере для каждого из их кодов заданий были выполнены обновления в таблице сведений о кодах заданий.MRR и бонус Джейн, приложенные к ее коду работы, были обновлены в таблице с подробным описанием кода работы с 1 января 19 года.MRR и бонус Джона, приложенные к его коду работы, были обновлены в таблице с подробным описанием кода работы, вступившей в силу 2/10/19.При извлечении записи о сотруднике результаты должны извлекать MRR и бонус, которые действовали на указанную дату.

Таблица истории сотрудников

EE ID   || Name       || Eff Date   || Co.   || Job Code || Title || Status    
12345   || Jane Doe   || 5/12/2019  || Apple || A9999    || VP    || Active    
12345   || Jane Doe   || 2/1/2019   || Apple || A9999    || VP    || Active    
54321   || John Smith || 6/5/2019   || Apple || A0002    || Mgr   || Active    
54321   || John Smith || 4/29/2019  || Apple || A0002    || Mgr   || Active    
54321   || John Smith || 1/12/2019  || Apple || A0002    || Mgr   || Active

Подробная таблица кодов работ

Job Code|| Title || Eff Date    || MRR || Bonus || OCC 
A9999   || VP    || 4/1/2019    || 5   || 25%   || E     
A9999   || VP    || 1/12/2019   || 4   || 20%   || E    
A0002   || Mgr   || 2/10/2019   || 3   || 15%   || E       
A0002   || Mgr   || 11/01/2018  || 2   || 10%   || E    

Что должен извлечь отчет

EE ID   || Name       || Eff Date   || Co.   || Job Code || Title || MRR|| Bonus || OCC || Status    
12345   || Jane Doe   || 5/12/2019  || Apple || A9999    || VP    || 5  || 25%   || E   || Active    
12345   || Jane Doe   || 2/1/2019   || Apple || A9999    || VP    || 4  || 20%   || E   || Active    
54321   || John Smith || 6/5/2019   || Apple || A0002    || Mgr   || 3  || 15%   || E   || Active    
54321   || John Smith || 4/29/2019  || Apple || A0002    || Mgr   || 3  || 15%   || E   || Active    
54321   || John Smith || 1/12/2019  || Apple || A0002    || Mgr   || 2  || 10%   || E   || Active

1 Ответ

0 голосов
/ 03 июля 2019

Возможно, есть более эффективные способы, но мне удалось выяснить это с помощью SELECT TOP в инструкции SELECT.

SELECT E.EMPLID AS [EE ID]
    ,E.Name AS [Name]
    ,E.EFFDT AS [Eff Date]
    ,E.COMPANY AS [Co.]
    ,E.JOBCODE AS [Job Code]
    ,E.JOBTITLE [Title]
    ,(SELECT TOP 1 J.GRADE
        FROM JobCodeTable AS J
        WHERE E.JOBCODE = J.JOBCODE
        AND
        E.EFFDT >= J.EFFDT
        ORDER BY J.EFFDT DESC
    ) AS [MRR]
    ,(SELECT TOP 1 J.BONUS
        FROM JobCodeTable AS J
        WHERE E.JOBCODE = J.JOBCODE
        AND
        E.EFFDT >= J.EFFDT
        ORDER BY J.EFFDT DESC
    ) AS [Bonus]
    ,(SELECT TOP 1 J.OCC_TYPE
        FROM JobCodeTable AS J
        WHERE E.JOBCODE = J.JOBCODE
        AND
        E.EFFDT >= J.EFFDT
        ORDER BY J.EFFDT DESC
    ) AS [OCC]
    ,E.EMPL_STATUS_DESC AS [Status]
FROM Employee History AS [E]
WHERE E.EMPL_STATUS_DESC = 'Active'
    AND
    E.EFFDT >= '2019-01-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...