我有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 DATE
且WORK DATE
位于EMP ID
匹配。
答案 0 :(得分:0)
也许当您加入pay_rates
到work_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的最大有效日期,该日期小于员工的工作日期。然后将结果返回到工资率表中以提取费率。