Sql 来自两个不同表的生效日期,匹配特定日期的记录
我试图从19年1月1日起提取员工记录。我正在将员工历史记录表连接到职务代码详细信息表。对于每个员工记录,我希望匹配截至员工记录生效日期的职务代码详细信息。因此,如果在19年2月1日有员工记录,我想要当时有效的职务代码细节;并且,它不需要引入堆栈顶部的作业代码细节,这些细节自19年2月1日以来可能已经发生了变化。我对正确的编码有问题 我尝试了下面的代码,但不确定它是否正确。我加入了J2表以获取另一个报告,该报告用于提取堆栈顶部的作业代码记录(即,其中J2.EFFDT=NULL)。不确定我当前的请求是否需要使用类似的东西,以及如何将其纳入WHERE语句Sql 来自两个不同表的生效日期,匹配特定日期的记录,sql,sql-server,join,Sql,Sql Server,Join,我试图从19年1月1日起提取员工记录。我正在将员工历史记录表连接到职务代码详细信息表。对于每个员工记录,我希望匹配截至员工记录生效日期的职务代码详细信息。因此,如果在19年2月1日有员工记录,我想要当时有效的职务代码细节;并且,它不需要引入堆栈顶部的作业代码细节,这些细节自19年2月1日以来可能已经发生了变化。我对正确的编码有问题 我尝试了下面的代码,但不确定它是否正确。我加入了J2表以获取另一个报告,该报告用于提取堆栈顶部的作业代码记录(即,其中J2.EFFDT=NULL)。不确定我当前的请求
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添加到标记中。请发布一些示例数据和预期结果来说明问题。我确实添加了我正在查看的表以及预期结果。谢谢