2017-07-08 4 views
1

Es scheint nicht möglich zu sein, eines mit einem Format zu finden, das nahe genug ist, um eine solide Antwort zu erhalten. Versuchen Sie, sich mit ausgewählten Fallaussagen zu messen, aber es erweist sich als ein Schmerz. Ich habe eine grundlegende Gehaltsabrechnungsdatenbank, die ich aufstelle (Diagramm unten gezeigt), und die Idee ist, dass ich die folgende Aussage machen möchte, wenn die Angestelltekategorie eines Angestellten (EmpCat) 1 ist, aber eine getrennte Aussage, wenn es 2 ist (im Grunde stündlich vs Gehalt). Es ist immer noch relativ neu, sich mit T SQL zu beschäftigen, daher würde jede Hilfe sehr geschätzt werden.So erstellen Sie eine bedingte gespeicherte Prozedur

EDIT: Ich habe das Verfahren angepasst. Es sieht so aus, als ob es jetzt tun sollte, was ich will, und sollte sogar die gesamten geleisteten Arbeitsstunden im Bezahlzeitraum automatisch summieren, aber ich erhalte jetzt einen Fehler, der besagt, dass es nicht in einer Aggregatfunktion oder einer GROUP BY-Klausel enthalten ist. Probleme haben, herauszufinden, wo das ein Problem ist.

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

Warum begrenzen Sie den Namen? Wäre es nicht besser, einen Batch-Lauf zu machen und alle auf einmal zu erledigen? –

+0

machen zwei separate SELECT-Anweisung und machen den Einsatz separat, select * from tblemployee a tblemployeedetail b auf a.empid = b.empid verbinden, in dem b.empcat = 1 select * from tblemployee einem tblemployeedetail b kommen auf a.empid = b.empid wo b.empcat = 2 –

Antwort

1

Wenn Sie eine sp behandeln sowohl Sie müssen wie die SELECT-Anweisung innerhalb des StoredProc suchen, etwas haben:

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] 

Andernfalls, wenn Sie dies möchten nur beschäftigen mit den Stunden arbeitet, dann verwenden Sie:

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

Das scheint zu tun, was ich brauche - jetzt bekomme ich einen Fehler, weil es weder in einer Aggregatfunktion noch in einer GROUP BY-Klausel enthalten ist. Das Verfahren, wie ich es habe, ist oben modifiziert. –

+0

Sie haben einen SUM hinzugefügt. Jedes Mal, wenn Sie eine Aggregatfunktion verwenden, müssen Sie nach allen anderen Feldern in Ihrer SELECT-Anweisung GROUP BY. In Ihrem Fall ist das ganz einfach - fügen Sie einfach GROUP BY e.EmpID ganz am Ende der SELECT-Anweisung hinzu. –

+0

Das habe ich auch gedacht - aber wenn ich hinzufüge, tauscht es die eine Fehlermeldung für drei weitere aus; dass die Spalten tblEmployeeDetail.EmpCat, tblEmployee.PayRate und tblEmployee.PayRate in der Auswahlliste ungültig sind, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten sind. –

Verwandte Themen