2016-07-05 62 views
-3

我的查詢顯示錯誤,請問任何人都可以幫助我。如何編寫兩個案例語句以防案件

我的查詢:

SELECT  A.EmpCodeC, 
      E.EmpNameC, 
      B.DesigNameC, 
      C.DeptNameC, 
      D.SecNameC, 
      A.ClockDateD, 
      TimeClk1N, 
      TimeClk2N, 
      TimeClk3N, 
      TimeClk4N, 
      A.BJClk1N, 
      A.BJClk2N, 
      A.BJClk3N, 
      A.BJClk4N, 
      A.TimeInN, 
      A.TimeOutN, 
      A.ShiftCodeC, 
      A.NormalN, 
      A.ActlWrkHrsN, 
      A.LatenessN, 
      A.UnderN, 
      A.OT10N, 
      A.OT15N, 
      A.OT20N, 
      A.OT30N, 
      A.SflatN, 
      A.ShiftAllN, 
      A.MealAllN, 
      A.TranAllN, 
      A.Oth1AllN, 
      A.Oth2AllN, 
      A.HealthAllN, 
      A.AttdAllN, 
      A.ReaCodeC, 
      A.SplReaCodeC, 
      Isnull(I.PayTypeC, '') PayType, 
      E.BasicSalaryN, 
      CASE 
         WHEN Datename(dw, A.ClockDateD)='Sunday' THEN 
           CASE 
              WHEN A.OT20N >4 THEN ((E.BasicSalaryN/(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (4+A.OT10N+A.OT20N+ A.OT30N)) 
              ELSE ((E.BasicSalaryN    /(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (A.OT10N+A.OT15N+ A.OT20N+ A.OT30N)) 
           END AS OT_Amnt, 
           CASE 
              WHEN A.OT20N >4 THEN ((E.BasicSalaryN/(SubString(CAST(EOMONTH (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (A.OT15N-4)) 
              ELSE ('0.00') 
           END AS Insentive_Amnt 
         ELSE '0.00' OT_Amnt '0.00' Insentive_Amnt 
      END 
FROM  Daily A 
INNER JOIN TMSStrt.DBO.Designation B 
ON   A.DesigCodeC = B.DesigCodeC 
INNER JOIN TMSStrt.DBO.Department C 
ON   A.DeptCodeC = C.DeptCodeC 
INNER JOIN TMSStrt.DBO.Section D 
ON   A.SecCodeC = D.SecCodeC 
AND  D.DeptCodeC = C.DeptCodeC 
INNER JOIN StaffMaster E 
ON   A.EmpCodeC = E.EmpCodeC 
LEFT JOIN TMSStrt.DBO.Reason I 
ON   A.ReaCodeC = I.ReasonCodeC 
WHERE  A.ClockDateD >= '01-07-2016' 
AND  A.ClockDateD <= '04-07-2016' 
ORDER BY E.EmpNameC, 
      A.ClockDateD 
+1

請修復您的格式。一行代碼每個可見寬度,並縮進4個空格以使文本等寬。 –

+3

發佈大量文字並說它「顯示錯誤」,而沒有說出那些錯誤是什麼,它們出現在哪一行上,更重要的是你實際上想要達到的效果不太可能引起積極的反應。正如已經要求格式化您的代碼,確定導致錯誤的特定部分,描述您正在嘗試執行的操作,然後有人可能會幫助您。 – GarethD

回答

0

您的外殼是錯誤的。喲不能從CASE內部返回兩列,你只能返回一個值。因此,你可以寫:

 ... 
     CASE 
      WHEN Datename(dw, A.ClockDateD)='Sunday' THEN 
       CASE 
        WHEN A.OT20N >4 THEN ((E.BasicSalaryN/(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (4+A.OT10N+A.OT20N+ A.OT30N)) 
        ELSE ((E.BasicSalaryN    /(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (A.OT10N+A.OT15N+ A.OT20N+ A.OT30N)) 
       END 
      ELSE 0.0 
     END AS OT_Amnt, 
     CASE 
      WHEN Datename(dw, A.ClockDateD)='Sunday' AND A.OT20N >4 THEN ((E.BasicSalaryN/(SubString(CAST(EOMONTH (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (A.OT15N-4)) 
      ELSE 0.0 
     END AS Insentive_Amnt, 
     ... 

另外要小心那些日期爲varchar類型轉換,子和混合數字和刺痛的數據的算術基礎。使用日期函數會更好(例如:Year(EOMONTH (A.ClockDateD))-2000而不是(SubString(CAST(EOMONTH (A.ClockDateD) AS VARCHAR(20)),9,2)

0

好吧,看看你到目前爲止 - 你的查詢有一點點錯誤。 首先,你已經嵌套的案例陳述(這將不會工作)具有完全相同的行爲?我想他們應該是如下

Case語句:

 CASE 
     WHEN Datename(dw, A.ClockDateD)='Sunday' AND A.OT20N >4 
     THEN ((E.BasicSalaryN/(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (4+A.OT10N+A.OT20N+ A.OT30N)) 
     ELSE ((E.BasicSalaryN/(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (A.OT10N+A.OT15N+ A.OT20N+ A.OT30N)) 
     END AS OT_Amnt 


    CASE 
     WHEN Datename(dw, A.ClockDateD)='Sunday' WHEN A.OT20N >4 
     THEN ((E.BasicSalaryN/(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (4+A.OT10N+A.OT20N+ A.OT30N)) 
     ELSE ((E.BasicSalaryN/(Substring(Cast(Eomonth (A.ClockDateD) AS VARCHAR(20)),9,2))/9)* (A.OT10N+A.OT15N+ A.OT20N+ A.OT30N)) 
    END AS Insentive_Amnt, 

嵌套被完全除去,只需要調用兩個獨立的case語句,與MSSQL有可以忽略不計的開銷在複製一個case語句

如果你想保留你的嵌套想法,你將需要切換到存儲過程。在那裏你可以使用if語句設置一個變量,然後在if語句中調用你的case語句。

從我看到雖然你不需要存儲過程。另一個需要注意的

ELSE '0.00' OT_Amnt '0.00' Insentive_Amnt 

我不知道這是什麼,但它絕不工作,如果你正在嘗試來連接你需要使用&或+語法根據數據類型的東西。

+0

如果datename不是星期天,那麼兩個CASE表達式都會返回錯誤的結果,如果'A.OT20N <= 4',則第二個CASE也應該返回0。我也想刪除嵌套,但我不得不重複測試datename是星期天,我不確定哪一個實際執行得最好(這取決於數據) –

+0

如果是這樣的話,我會說使用在那裏有一個IF語句塊的存儲過程。 – Caz1224

+0

在這種情況下存儲過程將如何提供幫助?這是一個單一的查詢,你不能從查詢中調用存儲過程。你是否想過表值函數和CROSS APPLY?我認爲最好的方法是CASE表達式(嵌套或扁平化) –