Sql server TSQL除以零误差

Sql server TSQL除以零误差,sql-server,sql-server-2008,tsql,stored-procedures,Sql Server,Sql Server 2008,Tsql,Stored Procedures,我有一个正在做数学运算的查询,在有些时候,一个数字可能是一个零,它除以这个零会导致一个错误 我在这个网站上找到了一些关于如何修复它的信息,但是现在这个数字根本没有改变 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 shortT

我有一个正在做数学运算的查询,在有些时候,一个数字可能是一个零,它除以这个零会导致一个错误

我在这个网站上找到了一些关于如何修复它的信息,但是现在这个数字根本没有改变

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');

您的错误不是来自空值,如果您只是除以一个整数,例如1/15=0
,只需将术语更改为:
合并(将服务水平(短期损失视为浮动)/NULLIF(A.短期,0),0.00)*12视为短期损耗

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

我使用的SQLServer 2008没有任何编码,只是一个需求——如果
短期
NULL
,您希望得到什么样的相等结果?
0.00
是我想要的任何值为NULL或除以零的错误。在这种情况下,我确实有方程的有效数字,但它仍然显示
0.00
shorttermloss
一个整数吗?然后将其更改为
COALESCE(服务水平短期损失*1.0/NULLIF(A.shortTerm,0),0.00)*12作为短期损耗
>
选择1/@shortTerm=0?
我们能轻松地将其转换为正常百分比吗<代码>0.799999992%
我还是有点困惑。。XML的输出如下所示,使用您的代码'15 2 1 1 8.000000000000000 E-001',您必须为您的数据找到合适的类型,可能是money、float、decimal(x,y),这取决于短期使用的数据类型。