2017-07-08 88 views
1

似乎无法找到一个格式足够接近,以得到一个坚实的答案。试图混淆选择案例陈述,但事实证明这是一种痛苦。我有一个基本的工资数据库,我正在设置(如下图所示),我的想法是如果员工的员工类别(EmpCat)为1,我想执行以下语句,但是如果是2,基本上每小时与薪水)。还是相当新的摆弄T SQL,所以任何援助将不胜感激。如何创建一个条件存储过程

编辑:我调整了程序。它看起来应该做我现在想要的,甚至应该自动总结支付期间的总工作时间,但是我现在收到一个错误,指出它没有包含在聚合函数或GROUP BY子句中。无法弄清楚这是一个问题。

CREATE PROCEDURE NewTimesheet(
@LName varchar(50), 
@FName varchar(50), 
@ShiftType char(2), 
@StartDate date, 
@EndDate date, 
@OTHours decimal(18,2), 
@HolidayHours decimal(18,2) 
) 
AS 
BEGIN 
INSERT INTO tblTimesheet(
EmpID, 
ShiftType, 
StartDate, 
EndDate, 
TotalHours, 
OTHours, 
HolidayHours, 
NetPay 
) 
SELECT e.EmpID, @ShiftType, @StartDate, @EndDate, SUM(HoursWorked) , 
@OTHours, @HolidayHours, 
CASE WHEN ed.EmpCat = 1 
THEN (SUM(HoursWorked) * PayRate) 
ELSE (e.PayRate/24) 
END 
FROM tblEmployee e INNER JOIN tblEmployeeDetail ed ON e.EmpID = ed.EmpID 
inner join tblShifts on e.EmpID = tblShifts.EmpID 
WHERE [email protected] AND [email protected] AND Date > @StartDate AND Date < 
@EndDate 
GROUP BY e.EmpID, ed.EmpCat, e.PayRate, tblShifts.HoursWorked 
END 

enter image description here

+0

你为什么限制名称?做一个批处理并且一个人去做每个人会不会更好? –

+0

做出两个单独的select语句并分别执行插入, select * from tblemployee a join tblemployeedetail b on a.empid = b.empid where b.empcat = 1 select * from tblemployee a join tblemployeedetail b on a.empid = b.empid where b.empcat = 2 –

回答

1

如果你想要一个SP处理都需要有StoredProc内寻找类似的SELECT语句:

SELECT e.EmpID, @ShiftType, @StartDate, @EndDate, @TotalHours, @OTHours, 
@HolidayHours, CASE WHEN ed.EmpCat = 1 THEN (@TotalHours * 
tblEmployee.PayRate) ELSE (insert logic for salary) END 
FROM tblEmployee e INNER JOIN tblEmployeeDetail ed ON e.EmpID = ed.EmpID 
WHERE [email protected] AND [email protected] 

否则,如果你想这只是应对与小时工作,那么你使用:

SELECT e.EmpID, @ShiftType, @StartDate, @EndDate, @TotalHours, @OTHours, 
@HolidayHours, @TotalHours * tblEmployee.PayRate 
FROM tblEmployee e INNER JOIN tblEmployeeDetail ed ON e.EmpID = ed.EmpID 
WHERE [email protected] AND [email protected] AND ed.EmpCat = 1 

HTH

+0

这似乎是做我所需要的 - 现在我收到一个错误,它不包含在聚合函数或GROUP BY子句中。我所拥有的程序在上面进行了修改。 –

+0

你已经添加了一个SUM。每次使用任何聚合函数时,都必须将SELECT语句中的所有其他字段GROUP BY。在你的情况下,这很容易 - 只需在SELECT语句的最后添加GROUP BY e.EmpID –

+0

这就是我的想法 - 但是当我添加它时,它将一个错误消息交换三个;指出列tblEmployeeDetail.EmpCat,tblEmployee.PayRate和tblEmployee.PayRate在选择列表中无效,因为它们不包含在聚合函数或GROUP BY子句中。 –