Вот моя тестовая схема:
Create Table person_cost
(
PersonId int not null
, Rate decimal(15,4) not null
, [date] datetime not null
, Constraint PK_person_cost Primary Key Clustered ( PersonId, [date] )
)
Insert person_cost(PersonId, Rate, [date]) Values(1,30,'2010-01-01')
Insert person_cost(PersonId, Rate, [date]) Values(1,40,'2010-02-05')
Insert person_cost(PersonId, Rate, [date]) Values(1,50,'2010-03-01')
Create Table Work
(
PersonId int not null
, [Date] datetime not null
, Hours int not null
)
Insert Work(PersonId, [Date], Hours) Values(1, '2010-01-05', 10)
Insert Work(PersonId, [Date], Hours) Values(1, '2010-01-27', 5)
Insert Work(PersonId, [Date], Hours) Values(1, '2010-02-10', 10)
Insert Work(PersonId, [Date], Hours) Values(1, '2010-03-03', 5)
И мой запрос:
Select Work.PersonId, Work.Hours, PayRanges.Rate
, Work.Hours * PayRanges.Rate As Value
From Work
Join (
Select pc1.PersonId, pc1.[date] As StartDate, Rate
, Coalesce((Select Min(pc2.[date])
From person_cost As pc2
Where pc2.personId = pc1.personId
And pc2.[date] > pc1.[date])
, '9999-12-31') As NextEffectiveDate
From person_cost As pc1
) As PayRanges
On Work.PersonId = PayRanges.PersonId
And Work.[Date] >= PayRanges.StartDate
And Work.[Date] < PayRanges.NextEffectiveDate
По сути, я рассчитал дату окончания эффективной ставки заработной платы.В моем примере я исключил соединение с таблицей Person, однако его можно легко включить для получения данных Person.Обратите внимание, что мой расчет даты истечения срока выплаты будет осуществляться в день, когда вступит в силу следующий размер выплаты, и поэтому я запрашиваю стоимость, строго меньшую даты истечения срока действия.