SQL,加入workdate按生效日期支付费率

时间:2018-01-29 17:57:56

标签: sql join

我有2个表,一个有员工工作日期,另一个有每个员工的工资率,当这些费率生效时。

他们看起来像这样:

#header {
     padding:300px 0;
}

CREATE TABLE pay_rates ( [EMP ID] [int] NOT NULL, [RATE] [decimal](11, 6) NOT NULL, [EFFECTIVE DATE] [datetime] NOT NULL ) CREATE TABLE work_dates ( [EMP ID] [int] NOT NULL, [WORK DATE] [datetime] NOT NULL, ) 表将为每位员工提供许多条目,因为他们的薪酬多年来一直在调整。

pay_rates表包含每个员工工作的日期。

这两个表都包含其他信息,但我已简化为相关列。

我想加入这两个人,以便我可以看到每个工作日的工资率。从技术上讲,我希望将work_dates中的每条记录加入到work_dates中的记录,其中最大pay_rates小于EFFECTIVE DATEWORK DATE位于EMP ID匹配。

2 个答案:

答案 0 :(得分:0)

也许当您加入pay_rateswork_dates时,您可以使用not exists要求不存在生效日期在工作日期和严格在您加入的生效日期之后。像这样:

declare @pay_rates table (
    [EMP ID] [int] NOT NULL,
    [RATE] [decimal](11, 6) NOT NULL,
    [EFFECTIVE DATE] [datetime] NOT NULL
);

declare @work_dates table (
    [EMP ID] [int] NOT NULL,
    [WORK DATE] [datetime] NOT NULL
);

insert @pay_rates values
    (1, 10.25, '20160615'), 
    (1, 10.65, '20170101'), 
    (1, 11.85, '20180101');
insert @work_dates values 
    (1, '20160701'), 
    (1, '20170101'), 
    (1, '20170701'), 
    (1, '20171231'), 
    (1, '20180102');

select
    WorkDate.[EMP ID],
    WorkDate.[WORK DATE],
    Rate.RATE,
    Rate.[EFFECTIVE DATE]
from
    @work_dates WorkDate
    inner join @pay_rates Rate on
        WorkDate.[EMP ID] = Rate.[EMP ID] and
        WorkDate.[WORK DATE] >= Rate.[EFFECTIVE DATE] and
        not exists
        (
            select 1 
            from @pay_rates LaterRate 
            where
                LaterRate.[EMP ID] = WorkDate.[EMP ID] and
                LaterRate.[EFFECTIVE DATE] <= WorkDate.[WORK DATE] and
                LaterRate.[EFFECTIVE DATE] > Rate.[EFFECTIVE DATE]
        );

我在此假设您不允许两个工资率在同一个员工的同一日生效。在这种情况下,上述查询会为使用这些费率的每个工作日期提供两个结果,因为它无法优先考虑其中一个。

答案 1 :(得分:0)

我认为你需要:

SELECT pr2.[emp id], pr2.rate
FROM pay_rates pr2
INNER JOIN
(SELECT wd.[emp id], MAX(pr.[effective date]) AS mx_date
 FROM work_dates wd
 LEFT JOIN pay_rates pr
 ON (wd.[emp id] = pr.[emp id] AND wd.[work date] > pr.[effective date])
 GROUP BY wd.[emp id]) sub
ON pr2.[emp id] = sub.[emp id] AND pr2.[effective date] = sub.mx_date

在子查询中,选择每个emp id的最大有效日期,该日期小于员工的工作日期。然后将结果返回到工资率表中以提取费率。