我在样本数据中添加了一些记录,以解决围绕PersonID 具有多个时间范围的可能性提出的问题,其中PersonID 具有相同的Title 和Salary。
答案:
create table dbo.Salary
(
PersonID varchar(3)
, StartDate date
, EndDate date
, Salary int
)
create table dbo.Title
(
PersonID varchar(3)
, StartDate date
, EndDate date
, Title varchar(10)
)
insert into dbo.Salary
values ('Me', '2017-01-01', '2017-01-31', 2000)
, ('Me', '2017-02-01', '2017-05-31', 2100)
, ('Me', '2017-06-01', '2017-07-31', 2300)
, ('You', '2017-01-01', '2017-03-31', 2400)
, ('You', '2017-04-01', '2017-08-31', 2500)
, ('You', '2017-09-01', '2017-12-31', 2400)
insert into dbo.Title
values ('Me', '2017-01-01', '2017-03-31', 'Junior')
, ('Me', '2017-04-01', '2017-07-31', 'Senior')
, ('You', '2017-01-01', '2017-02-28', 'Junior')
, ('You', '2017-03-01', '2017-05-31', 'Senior')
, ('You', '2017-06-01', '2017-12-31', 'Junior')
select a.PersonID
, a.StartDate
, a.EndDate
, a.Salary
, a.Title
from (
select s.PersonID
, iif(s.StartDate < t.StartDate, t.StartDate, s.StartDate) as StartDate
, iif(s.EndDate < t.EndDate, s.EndDate, t.EndDate) as EndDate
, s.Salary
, t.Title
from dbo.Salary as s
inner join dbo.Title as t on s.PersonID = t.PersonID
) as a
where 1=1
and datediff(d, a.StartDate, a.EndDate) >= 0 --is it a valid time range?
子查询复制PersonID 的所有可能的StartDate / EndDate 组合,外部查询确定该时间范围是否有效。
输出:
PersonID StartDate EndDate Salary Title
Me 2017-01-01 2017-01-31 2000 Junior
Me 2017-02-01 2017-03-31 2100 Junior
Me 2017-04-01 2017-05-31 2100 Senior
Me 2017-06-01 2017-07-31 2300 Senior
You 2017-01-01 2017-02-28 2400 Junior
You 2017-03-01 2017-03-31 2400 Senior
You 2017-04-01 2017-05-31 2500 Senior
You 2017-06-01 2017-08-31 2500 Junior
You 2017-09-01 2017-12-31 2400 Junior