2014-10-18 88 views
0

我有一個查詢正在做一些數學計算,有些時候數字可能是一個零,它的分割將導致一個錯誤。TSQL除以零誤差

我在這個網站上發現了一些關於如何解決它的問題,但現在這個數字根本不會改變。

Example Data: 
los.shortTermLosses = 1 
A.shortTerm = 15 
Giving the equation of 1/15*12 = 0.8 

COALESCE(los.shortTermLosses/NULLIF(A.shortTerm,0),0.00)* 12 AS shortTermAttrition 

它必須是我做的事情,以防止除以零錯誤,但不知道如何讓它正常工作。目前的結果總是0.00

更新

對於那些誰希望看到整個查詢..

SELECT A.QID, 
      (SELECT TOP 1 E.[FirstName], 
          E.[LastName], 
          E.[NTID], 
          E.[TitleDesc], 
          A.[countOfDirects], 
          A.[longTerm], 
          A.[shortTerm], 
          COALESCE(los.totalLosses,0) totalLosses, 
          COALESCE(los.longTermLosses, 0) longTermLosses, 
          COALESCE(los.shortTermLosses,0) shortTermLosses, 
          COALESCE(los.shortTermLosses/NULLIF(A.shortTerm,0),0.00)* 12 AS shortTermAttrition, 
          COALESCE(los.longTermLosses/NULLIF(A.longTerm,0),0.00)* 12 AS longTermAttrition, 
          COALESCE(los.totalLosses/NULLIF(A.countOfDirects,0),0.00)* 12 AS totalAttrition 
      FROM  employeeTable_historical AS E 
      OUTER APPLY (SELECT   COUNT(b.leaver) as [totalLosses], 
             sum(case when b.term = 'LTA' then 1 else 0 end) as [longTermLosses], 
             sum(case when b.term = 'STA' then 1 else 0 end) as [shortTermLosses] 
           FROM dbo.attritionData AS B 
           WHERE E.QID = B.supervisor 
           AND MONTH(B.leaveDate) = @month 
           AND YEAR(B.leaveDate) = @year 
           GROUP BY b.supervisor 
      )los 
      WHERE E.qid = A.[QID] 
        AND CONVERT (DATE, dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)) >= CONVERT (DATE, E.[Meta_LogDate]) 
      ORDER BY meta_logDate DESC 
      FOR  XML PATH (''), TYPE, ELEMENTS) 
    FROM (SELECT QID, 
        [timestamp], 
        [countOfDirects], 
        [longTerm], 
        [shortTerm] 
      FROM (SELECT QID, 
          [timestamp], 
          [countOfDirects], 
          [shortTerm], 
          [longTerm], 
          ROW_NUMBER() OVER (PARTITION BY QID ORDER BY [Timestamp]) AS Row 
        FROM [red].[dbo].[attritionCounts] 
        WHERE [mgrQID] = @director 
          AND YEAR(CAST ([timestamp] AS DATE)) = @year 
          AND MONTH(CAST ([timestamp] AS DATE)) = @month) AS Tmp1 
      WHERE Row = 1) AS A 
    FOR XML PATH ('DirectReport'), TYPE, ELEMENTS, ROOT ('Root'); 
+0

我使用SQLServer的2008 – SBB 2014-10-18 17:25:14

+0

無需任何編碼來鑄造結果爲錢,只是談到一個要求 - 如果shortTerm是NULL,你期望得到什麼樣的equasion結果? – TarasB 2014-10-18 17:27:17

+0

對於任何具有零值或除零誤差的東西,我都想要'0.00'。在這種情況下,我確實有這個方程的有效數字,但它仍然顯示'0.00' – SBB 2014-10-18 17:28:15

回答

1

你的錯誤並不來自NULLIF,你只是一個分整數例如1月15日= 0
,只是改變你的任期到:
COALESCE(CAST(los.shortTermLosses as float)/NULLIF(A.shortTerm,0),0.00)* 12 AS shortTermAttrition

最接近轉型爲你的XML導出可能

Declare @shortTermLosses int = 1 
Declare @shortTerm int = 15 

select 
CAST(
COALESCE(CAST(@shortTermLosses AS float)/Cast(NULLIF(@shortTerm,0) AS float),0.00)* 12 
as Money) 
AS shortTermAttrition 
FOR  XML PATH (''), TYPE, ELEMENTS 
+0

我仍然很困惑..的XML的輸出是使用您的代碼如下' 2 1 1 8.000000000000000e-001' – SBB 2014-10-18 17:45:24

+0

您必須找到適合您的數據的類型,可能是money,float,decimal(x,y),它取決於用於shortTerm的數據類型。 – bummi 2014-10-18 17:48:31

+0

好吧,生病嘗試並找出答案 – SBB 2014-10-18 18:04:15