2012-04-01 9 views
2

こんにちはSQL SVR 2008のgurus。SQL Server 2008の式で埋め込まれたケース

SQL初心者の方には、ある方向を期待しています。私は、給与昼休みの資格があるかどうかを確認するために、各従業員のフィールド値に対して式をチェックする必要があるSELECTステートメントがあります。作業に必要な時間数は、minimumhoursというフィールドのworkerテーブルプロファイルにあり、ワークフローと呼ばれるテーブルのログインフィールドとログアウトフィールドの式から作業時間を計算します。次のように私がつなぎ合わせてきた文は(STARTDATEと終了日は、ユーザが選択可能な値になります)です。

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 

私は私の要件に合うように見えた任意の例を見ていませんでした、と

+3

何が問題ですか? – RBarryYoung

答えて

2

を期待していましたcase文の前に行方不明カンマがありました

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 

、および数学は少し変だった:私は、これはあなたが探しているものであることを願っています。 w.LunchDeductionをwf.MinimumHoursより小さい仕事をした場合の請求時間から差し引くことを意図していましたが、その情報をラウンド関数の精度パラメータとして使用しました。

+0

ありがとう、ニコラ。これはうまく動作し、CASEステートメントの構文をより明確に見ることができます。私はROUNDINGと関係がある別の関連する質問を掲示します。ここのCEOは、特定の丸めルールを適用したいと考えています。もう一度ありがとう、私の次の投稿で助けてくれるかもしれません:) –

+0

この質問に追加すると、w.lunchdeductionが0の場合にフィールドを出力する方法はありますか? –

+0

ようこそ。追加の質問については、私はそれを理解していませんでした。特定の条件の下で列を返すことができるのであれば、いいえ、できません。列は選択リストに固定されています。 PIVOTクエリとUNPIVOTクエリを除き、値のみを変更することができます。 –

関連する問題