T-SQL:计算员工的总工资
Posted
技术标签:
【中文标题】T-SQL:计算员工的总工资【英文标题】:T-SQL : calculate total salary of employees 【发布时间】:2021-06-17 05:53:12 【问题描述】:我想计算每个员工在一段时间内的工资,例如从 01-01-2021 到 05/31/2021。
我有这 3 张桌子:
老师
Id | DateOfBirth | PhoneNumber | |
---|---|---|---|
1 | 0001-01-01 | a@example.com | 23423424 |
2 | 1984-09-30 | b@example.com | 9832131 |
教师工资
Id | Salary | TeacherId | FromDate | ToDate | IsPartTime |
---|---|---|---|---|---|
1 | 500000 | 1 | 2021-01-01 | 2021-01-31 | 1 |
2 | 10000000 | 1 | 2021-02-01 | 2021-03-15 | 0 |
3 | 15000000 | 1 | 2021-03-16 | NULL (mean now) | 0 |
时间输入
Id | TeacherId | TeacherSalaryPartTime | Date |
---|---|---|---|
1 | 1 | 500000 | 2021-01-05 |
2 | 1 | 450000 | 2021-01-07 |
我想计算这些员工的总工资
例如在这种情况下,该员工从 2021 年 1 月 1 日到 2021 年 1 月 31 日是兼职,然后从时间输入 (500000+450000)
而 2021 年 2 月 1 日至 2021 年 3 月 15 日是(2 月的天数)(10000000/2 月的天数)+ 3 月的 15 天,工资计算为 10000000/(3 月的天数) (从 03/01/2021 到 03/15/2021)
并且 03/16/2021 到 05/31/2021 计算如下:(从 2021 年 3 月 16 日到月底的天数)(15000000/3 月的天数)+(天数从 2021 年 4 月 1 日到 2021 年 5 月 31 日)(15000000/天数)
你能帮我用 T-SQL 计算一下吗
谢谢
【问题讨论】:
欢迎来到 ***!您自己尝试过什么,为什么它对您不起作用?请edit您的问题包括您的个人尝试。 请同时标记您正在使用的SQL Server
的版本
请注意,就我们的目的而言,像“98”这样的 id 并不比像“98A98136-816F-4637-680F-08D930A8EE53”这样的 id 更容易理解。
[Date]列的格式有点可疑,数据类型是什么?
感谢您的帮助,现在是 datetime(2),完整格式为“1989-12-17 00:00:00.0000000”(您的 05/31/2021 是从哪里来的?)我想用 2 个参数 FromDate 和 Todate 创建一个存储过程
【参考方案1】:
你来了
DECLARE @StartDate DATE = '2021-01-01',
@EndDate DATE = '2021-05-31'
SELECT Teacher.Id AS Id,
Teacher.FullName AS FullName,
(
SELECT SUM(TimeEntry.TeacherSalaryPartTime) AS SalarySum
FROM TimeEntry
WHERE TimeEntry.EntryDate BETWEEN @StartDate AND @EndDate
AND TimeEntry.TeacherId = Teacher.Id
)
+
(
SELECT SUM(
TeacherSalary.Salary *
(DATEDIFF(
MONTH,
GREATEST(@StartDate, TeacherSalary.FromDate),
LEAST(@EndDate, ISNULL(TeacherSalary.ToDate, @EndDate))
) + 1)
) AS SalarySum
FROM TeacherSalary
WHERE TeacherSalary.IsPartTime = 0
AND TeacherSalary.FromDate >= @StartDate
AND TeacherSalary.ToDate <= @EndDate
AND TeacherSalary.TeacherId = Teacher.Id
)
FROM Teacher
【讨论】:
【参考方案2】:试试下面的。您可能想检查“现在”(您的 05/31/2021 来自哪里?)和 datediff 公式来调整,例如如果您有半个月,该怎么办。
select
t.Id
,sum(subquery1.[sum]) as [sum]
from
Teacher t
left join TeacherSalary s on s.TeacherId=t.Id
outer apply
(
select
case
when s.IsPartTime=0 then s.Salary * (1+datediff(month,s.FromDate,isnull(s.ToDate,'20210531')))
when s.IsPartTime=1 then
(
select sum(e.TeacherSalaryPartTime)
from
[Time Entry] e
where
e.TeacherId=t.Id
)
end
as [sum]
) as subquery1
group by t.Id
【讨论】:
感谢您的帮助,现在是 datetime(2),完整格式为“1989-12-17 00:00:00.0000000”(您的 05/31/2021 是从哪里来的?)我想创建一个带有 2 个参数 FromDate 和 Todate 的存储过程,05/31/2021 是 ToDate 的示例以上是关于T-SQL:计算员工的总工资的主要内容,如果未能解决你的问题,请参考以下文章