i have requirement calculate employee salary within given date range in sql server
my data
employee rate
table:
empl_id effective_date wage 101 5/23/2015 20 101 6/2/2016 30
project
table:
empl_id hrs_dt project_id hours 101 1/1/2015 10001 8 101 1/2/2015 10001 8 101 1/3/2015 10001 8 ... .... ..... .... 101 6/2/2016 .... ...
expected result:
empl_id hrs_dt proj_id hr wages 101 1/1/2015 10001 8 20 101 1/2/2015 10001 8 20 101 1/3/2015 10001 8 20 ... .... ... ... .... 6/2/2016 30
as starting point can join 2 tables on empl_id
column , ignore employee_rate
rows effective data later project date:
select p.empl_id, p.hrs_dt, p.project_id, p.hours, er.wage project p join employee_rate er on er.empl_id = p.empl_id , er.effective_date <= p.hrs_dt; empl_id hrs_dt project_id hours wage ---------- ---------- ---------- ---------- ---------- 101 2016-01-01 10001 8 20 101 2016-01-02 10001 8 20 101 2016-01-03 10001 8 20 101 2016-06-01 10001 8 20 ... 101 2016-06-02 10001 8 30 101 2016-06-02 10001 8 20
... can see gives multiple results once you've had wage change. want keep wage value last record, 'last' recent of before project hours date. can use analytic function row_number()
decide record is, using subquery , filtering find row 1 - have latest effective date:
select empl_id, hrs_dt, project_id, hours, wage ( select p.empl_id, p.hrs_dt, p.project_id, p.hours, er.wage, row_number() on (partition p.empl_id, p.hrs_dt order er.effective_date desc) rn project p join employee_rate er on er.empl_id = p.empl_id , er.effective_date <= p.hrs_dt ) tmp rn = 1; empl_id hrs_dt project_id hours wage ---------- ---------- ---------- ---------- ---------- 101 2016-01-01 10001 8 20 101 2016-01-02 10001 8 20 101 2016-01-03 10001 8 20 ... 101 2016-06-01 10001 8 20 101 2016-06-02 10001 8 30
tested in oracle original question tag, should work in sql server too.
Comments
Post a Comment