2014-10-18 2 views
0

У меня есть запрос, который выполняет некоторую математику, и в то время, когда число может быть равным нулю, его деление на которое приведет к ошибке.TSQL Divide by Zero Error

Я нашел что-то на этом веб-сайте о том, как исправить это, но теперь номер не меняется вообще.

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

Update

Для тех, кто хочет видеть весь запрос ..

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

+0

Без кодирования , просто говоря о требованиях - что вы ожидаете получить как результат равенства, если 'shortTerm' является' NULL'? – TarasB

+0

'0,00' - это то, что я хочу для всего, что имеет нулевое значение или деление на нулевую ошибку. В этом случае у меня есть действительные числа для уравнения, но он все еще показывает '0,00' – SBB

ответ

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

+0

Вам нужно будет найти подходящий тип для ваших данных, может быть, деньгами, float, decimal (x, y), это зависит от типы данных, используемые для shortTerm. – bummi

+0

ладно, плохо попробуйте и выясните это – SBB

Смежные вопросы