Sql 来自两个不同表的生效日期,匹配特定日期的记录

Sql 来自两个不同表的生效日期,匹配特定日期的记录,sql,sql-server,join,Sql,Sql Server,Join,我试图从19年1月1日起提取员工记录。我正在将员工历史记录表连接到职务代码详细信息表。对于每个员工记录,我希望匹配截至员工记录生效日期的职务代码详细信息。因此,如果在19年2月1日有员工记录,我想要当时有效的职务代码细节;并且,它不需要引入堆栈顶部的作业代码细节,这些细节自19年2月1日以来可能已经发生了变化。我对正确的编码有问题 我尝试了下面的代码,但不确定它是否正确。我加入了J2表以获取另一个报告,该报告用于提取堆栈顶部的作业代码记录(即,其中J2.EFFDT=NULL)。不确定我当前的请求

我试图从19年1月1日起提取员工记录。我正在将员工历史记录表连接到职务代码详细信息表。对于每个员工记录,我希望匹配截至员工记录生效日期的职务代码详细信息。因此,如果在19年2月1日有员工记录,我想要当时有效的职务代码细节;并且,它不需要引入堆栈顶部的作业代码细节,这些细节自19年2月1日以来可能已经发生了变化。我对正确的编码有问题

我尝试了下面的代码,但不确定它是否正确。我加入了J2表以获取另一个报告,该报告用于提取堆栈顶部的作业代码记录(即,其中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
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'
职务代码明细表

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

可能有更有效的方法,但我能够在SELECT语句中使用SELECT TOP找到它

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

请用您实际使用的数据库(例如SQL Server、Access)标记您的问题。“SQL”只是一种语言,不是真正的产品;我已经将SQL Server添加到标记中。请发布一些示例数据和预期结果来说明问题。我确实添加了我正在查看的表以及预期结果。谢谢