【问题标题】:Calculate salary based on weekday根据工作日计算工资
【发布时间】:2020-05-11 16:40:26
【问题描述】:

我正在计算给定日期的员工工资,工作日他的工资为 100 美元,周末工资为 150 美元,其他员工的工资率会有所不同,我将这个信息员工表维护为工作日工资和周末工资每个员工。

我希望输出为:

EmpId Name  Day       Date          Salary
11    abc   Thursday  05/07/2020    $100
11    abc   Friday    05/08/2020    $100
11    abc   Saturday  05/09/2020    $150
11    abc   Sunday    05/10/2020    $150

有人可以帮我在 Sql Server 中执行此操作吗? 非常感谢。

【问题讨论】:

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

假设你不关心银行假期,你就会有这样的事情

http://sqlfiddle.com/#!18/403353/3/0

您至少需要一张员工表、一张费率表和一张说明哪些员工工作了哪些天的表。

架构创建和示例数据:

CREATE TABLE DayRates(RateId INT NOT NULL PRIMARY KEY, Rate DECIMAL(12,2))

CREATE TABLE Employees(
  EmpId INT NOT NULL PRIMARY KEY,
  [Name] NVARCHAR(MAX) NOT NULL,
  WeekdayRateId INT NOT NULL,    
  WeekendRateId INT NOT NULL,
  CONSTRAINT FK_Employee_WeekdayRateId FOREIGN KEY(WeekdayRateId) REFERENCES DayRates(RateId),
  CONSTRAINT FK_Employee_WeekendRateId FOREIGN KEY(WeekendRateId) REFERENCES DayRates(RateId),
  )

CREATE TABLE EmployeeWorkDays(
  EmployeeWorkDayId INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  EmpId INT NOT NULL,
  [Date] DATETIME NOT NULL,
  CONSTRAINT FK_EmployeeWorkdDays_EmpId FOREIGN KEY(EmpId)  REFERENCES Employees(EmpId),
  )

INSERT DayRates VALUES (1,100),(2,150)
INSERT Employees VALUES (1, 'Joe', 1, 2)
INSERT EmployeeWorkDays (EmpId, [Date]) VALUES (1, '05/07/2020'),(1, '05/08/2020'),(1, '05/09/2020'),(1, '05/10/2020')

查询:

SELECT
  e.EmpId, e.[Name], ewd.[Date], DATENAME(WEEKDAY, ewd.[Date]) As Day
  ,CASE DATEPART(WEEKDAY, ewd.[Date]) WHEN 1 THEN r2.Rate 
                                      WHEN 7 THEN r2.Rate 
                                      ELSE  r1.Rate END As [Salary]
FROM Employees e
JOIN EmployeeWorkDays ewd ON e.EmpId = ewd.EmpId
JOIN DayRates As r1 ON e.WeekdayRateId = r1.RateId
JOIN DayRates As r2 ON e.WeekendRateId = r2.RateId

这将产生预期的结果:

EmpId   Name    Date                    Day         Salary
1       Joe     2020-05-07T00:00:00Z    Thursday    100
1       Joe     2020-05-08T00:00:00Z    Friday      100
1       Joe     2020-05-09T00:00:00Z    Saturday    150
1       Joe     2020-05-10T00:00:00Z    Sunday      150

如果您需要考虑银行假期,您的数据库将需要包含一个日历。请参阅@arron-bertrand 的评论,详细了解如何做到这一点

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多