在SQL Server中基于时间框架计算工资

在SQL Server中基于时间框架计算工资,sql,sql-server,Sql,Sql Server,我有一个包含员工工作时间的数据集。工资表包含每个员工编号的不同工资。将新薪资添加到特定员工的工资表时,它还包含该薪资的开始日期 在下面的输出中使用一个左连接,它显示了2个工资,但我只想根据日期(第一列)计算工资。因此,正确的工资应该是18,77 非常感谢您的帮助 SELECT Cast([date] AS DATE) AS Date, en.number AS EmployeeNumber,

我有一个包含员工工作时间的数据集。工资表包含每个
员工编号的不同工资。将新薪资添加到特定员工的工资表时,它还包含该薪资的开始日期

在下面的输出中使用一个左连接,它显示了2个工资,但我只想根据日期(第一列)计算工资。因此,正确的工资应该是18,77

非常感谢您的帮助

SELECT Cast([date] AS DATE)               AS Date, 
       en.number                          AS EmployeeNumber, 
       Cast([startwork] AS SMALLDATETIME) AS StartTime, 
       Cast([endwork] AS SMALLDATETIME)   AS EndingTime, 
       ew.salary                          AS Salary, 
       ew.startdate                       AS StartDateSalary 

FROM   [employeebeginendsummary] eb 
       LEFT JOIN employee e 
              ON eb.employee_id = e.id 
       LEFT JOIN employeegroup eg 
              ON e.employeegroup_id = eg.id 
       LEFT JOIN employeenumber en 
              ON eb.employee_id = en.employee_id 
       LEFT JOIN employeewage ew 
              ON eb.employee_id = ew.employee_id 
ORDER  BY date DESC
输出:

Date    EmployeeNumber  StartTime   EndingTime  Salary  StartDateSalary
2020-03-13  303 2020-03-13 06:00:00 2020-03-13 08:30:00 17,84   2020-01-06 00:00:00.000
2020-03-13  303 2020-03-13 06:00:00 2020-03-13 08:30:00 18,77   2020-01-27 00:00:00.000
2020-03-13  303 2020-03-13 08:50:00 2020-03-13 12:22:00 17,84   2020-01-06 00:00:00.000
2020-03-13  303 2020-03-13 08:50:00 2020-03-13 12:22:00 18,77   2020-01-27 00:00:00.000


这就是你要找的吗?您需要使用
row_number()
函数根据日期获取最新记录并对其进行筛选

select 
Date, 
EmployeeNumber, 
StartTime, 
EndingTime, 
Salary, 
StartDateSalary
from 
(
SELECT Cast([date] AS DATE)               AS Date, 
       en.number                          AS EmployeeNumber, 
       Cast([startwork] AS SMALLDATETIME) AS StartTime, 
       Cast([endwork] AS SMALLDATETIME)   AS EndingTime, 
       ew.salary                          AS Salary, 
       ew.startdate                       AS StartDateSalary,
       row_number() over(partition by EmployeeNumber,[date] order by ew.startdate desc) as rn
FROM   [employeebeginendsummary] eb 
       LEFT JOIN employee e 
              ON eb.employee_id = e.id 
       LEFT JOIN employeegroup eg 
              ON e.employeegroup_id = eg.id 
       LEFT JOIN employeenumber en 
              ON eb.employee_id = en.employee_id 
       LEFT JOIN employeewage ew 
              ON eb.employee_id = ew.employee_id 
ORDER  BY date DESC
)
where rn=1;

我不知道我是否理解正确。但是试试这个:

SELECT Cast([date] AS DATE)               AS Date, 
       en.number                          AS EmployeeNumber, 
       Cast([startwork] AS SMALLDATETIME) AS StartTime, 
       Cast([endwork] AS SMALLDATETIME)   AS EndingTime, 
       ew.salary                          AS Salary, 
       ew.startdate                       AS StartDateSalary 

FROM   [employeebeginendsummary] eb 
       LEFT JOIN employee e 
              ON eb.employee_id = e.id 
       LEFT JOIN employeegroup eg 
              ON e.employeegroup_id = eg.id 
       LEFT JOIN employeenumber en 
              ON eb.employee_id = en.employee_id 
       LEFT JOIN (select TOP 1 id, salary, startdate from employeewage order by startdate 
 desc) ew 
              ON eb.employee_id = ew.employee_id 
ORDER  BY date DESC

如果您想要最早的日期,也可以删除desc.

向我们显示一些示例表数据和预期结果-格式文本,无图像。好的,我编辑post@Luukv93这令人困惑。你说你想要18,77英镑的薪水,但在产出方面你有17.84英镑的记录。你需要恰当地提出你的问题。是的,这不是正确的工资,我需要根据日期确定工资,StartDateSalaryDate是特定员工的工作日期。因此,在2020年3月13日,303号员工从6点到8点30分工作。薪水应该是18,77,因为最新的起始工资是18,77,这很接近答案。但是工资应该是动态计算的。假设日期是2020-01-02,那么工资应该是17,84。选择表上的日期是从哪个表中?从EmployeeBeginedSummary(eb)中选择?因此尝试将eb.Date>=ew.start放在前面,并删除最前面的1它接近答案。但是工资应该是动态计算的。假设日期是2020-01-02,那么工资应该是1784英镑,加上
[Date]
分区中。这就是你需要的吗?你看哪一天?