【问题标题】:Effective Dates from Two Different Table, Matching Records as of a Certain Date来自两个不同表的生效日期,匹配某个日期的记录
【发布时间】:2019-11-12 16:28:11
【问题描述】:

我正在尝试提取自 2019 年 1 月 1 日以来的员工记录。我正在将员工历史记录表加入工作代码详细信息表。对于每个员工记录,我想匹配截至员工记录生效日期的职位代码详细信息。因此,如果 2/1/19 有员工记录,我会想要当时有效的工作代码详细信息;并且它不会拉入堆栈作业代码详细信息的顶部,该详细信息可能自 2/1/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

示例结果如下。这将提取自 2019 年 1 月 1 日以来 Jane Doe 和 John Smith 的所有员工记录。在此示例中,他们的每个职务代码都在职务代码详细信息表中完成了更新。 Jane 的工作代码附加的 MRR 和奖金已在工作代码详细信息表中更新,自 2019 年 4 月 1 日起生效。 John 的工作代码附带的 MRR 和奖金已在工作代码详细信息表中更新,自 2019 年 2 月 10 日起生效。拉取员工记录时,结果应拉取截至所列日期有效的MRR和Bonus。

员工历史记录表

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

【问题讨论】:

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

标签: sql sql-server join


【解决方案1】:

可能有更有效的方法,但我能够在 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]
    ,(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'

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多