У меня есть запрос, который выполняет некоторую математику, и в то время, когда число может быть равным нулю, его деление на которое приведет к ошибке.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');
Я использую SQLServer 2008 – SBB
Без кодирования , просто говоря о требованиях - что вы ожидаете получить как результат равенства, если 'shortTerm' является' NULL'? – TarasB
'0,00' - это то, что я хочу для всего, что имеет нулевое значение или деление на нулевую ошибку. В этом случае у меня есть действительные числа для уравнения, но он все еще показывает '0,00' – SBB