假设你不关心银行假期,你就会有这样的事情
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 的评论,详细了解如何做到这一点