【问题标题】:Get the employee wages within an effective date在生效日期内获取员工工资
【发布时间】:2016-04-07 01:13:58
【问题描述】:

我需要在 sql server 中计算给定日期范围内的 EMPLOYEE Salary

我的数据是

EMPLOYEE RATE表:

EMPL_ID EFFECTIVE_DATE  WAGE    
101        5/23/2015    20  
101        6/2/2016      30 

PROJECT表:

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     ....        ...

预期结果:

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

【问题讨论】:

  • 您说的是 SQL Server,但标记了 Oracle。您使用的是哪种产品?
  • 这是一个非常基本的 SQL 查询。请使用 Google 并查找如何执行此操作,试一试,并发布您在尝试自己解决时遇到的任何问题。
  • 您显示的数据看起来微不足道。但这是因为工资每天都在变化,并且两个表中的日期之间存在一对一的关系。您是否真的在工资变化和项目记录之间存在差距,并且您也想找到这些日期的适当工资值 - 即找出在任何给定日期的工资是多少?
  • 是的,它们是数据中的差距。在生效日期内可能会有 2 个月到 1 年的差异
  • 因此更改您的示例数据以显示这一点,并清楚地解释要求。不一定有这么大的差距,只是为了让您了解您的真实数据是什么样的,以及有差距的预期输出是什么。

标签: sql sql-server


【解决方案1】:

作为起点,您可以连接empl_id 列上的两个表,并忽略有效数据晚于项目日期的任何employee_rate 行:

select p.empl_id, p.hrs_dt, p.project_id, p.hours, er.wage
from project p
join employee_rate er on er.empl_id = p.empl_id
and 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

...但是正如您所看到的,一旦您改变了工资,就会产生多个结果。因此,您只想保留最后一条记录中的工资值,其中“last”是项目时间日期之前的最新记录。您可以使用 row_number() 之类的分析函数来确定是哪条记录,使用子查询然后过滤以查找第 1 行 - 它将具有最新的生效日期:

select empl_id, hrs_dt, project_id, hours, wage
from (
  select p.empl_id, p.hrs_dt, p.project_id, p.hours, er.wage,
    row_number() over (partition by p.empl_id, p.hrs_dt
      order by er.effective_date desc) as rn
  from project p
  join employee_rate er on er.empl_id = p.empl_id
  and er.effective_date <= p.hrs_dt
) tmp
where 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

在 Oracle 中测试,因为这是原始问题标签,但这也应该在 SQL Server 中工作。

【讨论】:

  • 谢谢。但我必须在 Sql server 中完成
  • 那么为什么您将问题标记为 Oracle 11g,而忽略了澄清您正在使用什么的请求? This might help.
  • 抱歉在多个论坛发错了。谢谢
  • @user6167232 - 更新了一个可以在两个数据库中使用的版本,但我无法在 SQL Server 中对其进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2022-12-02
  • 2021-10-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多