2012-04-01 4 views
2

Hallo SQL SVR 2008 Gurus.Eingebettete CASE mit Ausdrücken in SQL Server 2008

Als SQL-Neuling hoffe ich auf eine Richtung. Ich habe eine SELECT-Anweisung, die einen Ausdruck gegen einen Feldwert für jeden Arbeiter überprüfen muss, um zu sehen, ob sie für eine bezahlte Mittagspause qualifizieren. Der Wert der Anzahl der Stunden, die sie arbeiten müssen, ist in ihrem Arbeitstabellen-Profil in einem Feld namens minimumhours, und ich bekomme ihre Arbeitsstunden von einem Ausdruck gegen ein Login- und Logout-Feld in einer Tabelle namens workflow. Die Aussage, die ich genäht habe zusammen ist wie folgt (das Startdatum und Enddatum werden vom Benutzer wählbare Werte):

DECLARE @StartDate AS DateTime 
    SET @StartDate = CAST('03/25/2012' AS DATE) 
    DECLARE @EndDate AS DateTime 
    SET @EndDate = CAST('03/31/2012' AS DATE) 

    SELECT 
    w.Firstname 
    ,w.Lastname 
    ,wf.Login 
    ,wf.logout 
    ,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2) AS [Hours] 
    ,w.LunchDeduction AS [Lunch Deduction] 
    CASE [HoursBilled] = 
     WHEN DATEDIFF(hour, wf.Login, wf.Logout) < wf.MinimumHours THEN  
     ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,-   
      w.LunchDeduction,2) 
     WHEN DATEDIFF(hour, wf.Login, wf.Logout) >= wf.MinimumHours THEN 
      ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,- 0,2) 
    END 
    FROM Workers AS w 
    JOIN Workflow AS wf 
    ON wf.LoggedInWorkerid = w.ID 
    JOIN Roles AS r 
    ON w.RoleID = r.RoleID 
    WHERE (r.Descript = 'Hourly') 
    AND wf.Login >= @StartDate AND wf.Logout <= @EndDate 

Ich habe keine Beispiele gesehen, schienen meine Anforderungen zu passen, und habe gehofft,

+3

womit haben Sie Probleme? – RBarryYoung

Antwort

2

ich hoffe, dass das ist, was Sie suchen:

DECLARE @StartDate AS DateTime 
SET @StartDate = CAST('03/25/2012' AS DATE) 
DECLARE @EndDate AS DateTime 
SET @EndDate = CAST('03/31/2012' AS DATE) 

SELECT 
w.Firstname 
,w.Lastname 
,wf.Login 
,wf.logout 
,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2) AS [Hours] 
,w.LunchDeduction AS [Lunch Deduction] 
,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2) 
- CASE 
    WHEN DATEDIFF(hour, wf.Login, wf.Logout) < wf.MinimumHours THEN  
    w.LunchDeduction 
    ELSE 
0 
END AS [HoursBilled] 
FROM Workers AS w 
JOIN Workflow AS wf 
ON wf.LoggedInWorkerid = w.ID 
JOIN Roles AS r 
ON w.RoleID = r.RoleID 
WHERE (r.Descript = 'Hourly') 
AND wf.Login >= @StartDate AND wf.Logout <= @EndDate 

Es gibt ein Komma vor case-Anweisung fehlte, und mathematisches war ein bisschen seltsam. Es scheint mir, dass Sie beabsichtigten, w.LunchDeduction von Stunden abzuziehen, die in Rechnung gestellt wurden, wenn Arbeiter weniger als wf.MinimumHours in ihren/ihren Job einfügten, aber stattdessen verwendeten Sie diese Information als einen Präzisionsparameter, um Funktion zu runden.

+0

Danke Nikola. Dies funktioniert gut und kann die Syntax jetzt der CASE-Anweisung deutlicher erkennen. Ich werde eine weitere verwandte Frage stellen, die mit der RUNDUNG zu tun hat. Der CEO möchte hier spezifische Rundungsregeln anwenden. Nochmals vielen Dank und vielleicht können Sie mir mit meinem nächsten Post helfen :) –

+0

Als Ergänzung zu dieser Frage gibt es eine Möglichkeit, ein Feld auszugeben, wenn die w.lunchdeduction 0 ist? –

+0

Gern geschehen. Als zusätzliche Frage habe ich es nicht verstanden. Wenn Sie meinen, wenn Sie eine Spalte unter bestimmten Bedingungen nur dann zurückgeben können, dann können Sie nicht. Spalten sind in der Auswahlliste fixiert. Sie können nur Werte ändern, mit Ausnahme von PIVOT- und UNPIVOT-Abfragen. –