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 Email 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:计算员工的总工资的主要内容,如果未能解决你的问题,请参考以下文章

创建计算每个新插入员工的总工资的行级触发器

创建一个存储过程,接受并计算该部门的总工资并显示部门编号和总工资

练习题(困难) Salary Raise

C 计算员工工资

有啥比较好的员工工资管理系统么?

第七章 高级查询