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

时间:2019-07-02 04:41:16

标签: sql sql-server join

自19年1月1日以来,我正尝试提取员工记录。我将员工历史记录表添加到工作代码明细表中。对于每个员工记录,我要匹配员工记录生效日期的工作代码详细信息。因此,如果19年2月1日有员工记录,我希望当时有效的职务代码详细信息;并且不要拖入自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

示例结果如下。自19年1月1日以来,这刷新了Jane Doe和John Smith的所有员工记录。在此示例中,他们的每个工作代码在工作代码详细信息表中都有更新。 Jane的工作代码附带的MRR和奖金已在工作代码明细表中更新,有效日期为19/4/19。 John的MRR和附加在其工作代码上的奖金已在工作代码明细表中更新,日期为19/10/2。在提取员工记录时,结果应提取自列出日期起生效的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 :(得分:0)

也许有更有效的方法,但是我能够使用SELECT语句中的SELECT TOP找出来。

FOR /F "skip=1 tokens=1,2,3* delims= " %%G IN ('wmic printer get DriverName') DO (
SET ONE=%%G
SET TWO=%%H
SET THREE=%%I
CALL :LOOP
)

GOTO ENDLOOP
:LOOP

if "%ONE%"=="" GOTO ENDLOOP
if %ONE%==HP GOTO FIRSTCHECK
GOTO :EOF

:FIRSTCHECK
if %TWO%==DESKJET GOTO SECONDCHECK
GOTO :EOF

:SECONDCHECK
if %THREE%==1000 GOTO 1000
if %THREE%==2000 GOTO 2000
if %THREE%==3000 GOTO 3000
GOTO :EOF

:1000
ECHO Found HP DeskJet 1000
pause
GOTO :EOF

:2000
ECHO Found HP DeskJet 2000
pause
GOTO :EOF

:3000
ECHO Found HP DeskJet 3000
pause
GOTO :EOF

:ENDLOOP