sql - 在 SQL Server 中根据时间范围计算工资
问题描述
我有一个包含员工工作时间的数据集。工资表包含每人不同的工资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;
推荐阅读
- c# - Windows.Devices.Usb 接收延迟
- django - 文件上传到服务器后触发动作(文件存在于服务器路径上)
- android - Android 编译错误 - 任务 ':app:kaptDebugKotlin' 执行失败
- ubuntu - Ubuntu 16 R 无法验证以下签名
- php - SOAP 数据从 Postman 返回,但不使用 Guzzle
- javascript - 如何在for循环中比较两个不同长度的对象?
- reactjs - 更新地理位置值时无法读取未定义的属性“setState”
- java - java中VS Code和包装命名的问题
- apache - AH01797:客户端被服务器配置拒绝(任何目的地)
- sql - SQL 匹配新列