SQL Server:除以零错误

时间:2015-03-19 17:55:36

标签: sql-server tsql

我搜索了论坛,发现了几个关于这个主题的回复,但由于我是SQL的新手,我没有得到它。

我创建了一个TSQL查询,在运行时返回“除以零错误”。这是因为我将一列与另一列分开,其中一条记录中有零。好的,我得到了那个部分,但我无法解释如何解决问题的帖子的正面或反面。

SELECT 
    f.Sales_Rep1 AS 'Sales Rep'
    , SUM(CAST(f.Other1_Revenue + f.Other2_Revenue AS FLOAT)) AS 'MRR'
    , CW.MRR_Goal AS 'MRR Goal'
    , SUM((f.Other1_Revenue + f.Other2_Revenue)/(CW.MRR_Goal)) AS 'Total'
    , SUM(CAST(f.Product_Revenue + f.Service_Revenue AS FLOAT)) AS 'NRR'
    , CW.NRR_Goal AS 'NRR Goal'
    , (cw.MRR_Goal + cw.NRR_Goal)AS 'Total Goal'
FROM 
    dbo.v_rpt_Opportunity AS f 
INNER JOIN
    dbo.v_memberpickerlist AS m ON f.Sales_Rep1 = m.Member_ID 
INNER JOIN
    dbo.CW_SalesGoals AS CW ON CW.Sales_Rep = f.Sales_Rep1
WHERE 
    (f.Expected_Close_Date >= DATEADD(MM, DATEDIFF(MM, 0, GETDATE()), 0)) 
    AND (m.activestatus = 'active') AND (f.Status = 'Won') 
    OR (f.Expected_Close_Date >= DATEADD(MM, DATEDIFF(MM, 0, GETDATE()), 0)) 
    AND (m.activestatus = 'active') 
    AND (f.Status LIKE '%submitted%')
GROUP BY 
    f.Sales_Rep1, CW.MRR_Goal, CW.NRR_Goal, 
    f.Other1_Revenue, f.Other2_Revenue

我知道导致问题的那条线,但我不知道如何解决它......

SUM((f.Other1_Revenue + f.Other2_Revenue) / (CW.MRR_Goal)) AS 'Total'

我想要做的是获得目标的百分比,但我不能通过分区来做到这一点。

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用nullif()函数来避免除以零的例外:

(f.Other1_Revenue + f.Other2_Revenue) / nullif(CW.MRR_Goal, 0)

如果CW.MRR_Goal0,整个表达式的结果将为null 1

样品:

select 1 / nullif(0, 0) -- null

1 我选择了null,因为在我看来,它是SQL中undefined最合适的模拟。虽然这对于个人表达有帮助,但它可能不是您在聚合意义上所寻找的。

答案 1 :(得分:1)

使用CASE声明:

SUM(CASE WHEN CW.MRR_Goal <> 0 THEN (f.Other1_Revenue + f.Other2_Revenue)/(CW.MRR_Goal) ELSE 0 END) AS 'Total'

这样,只有当该记录中CW.MRR_Goal的值不为零时才会执行除法;如果它为零,则返回0

答案 2 :(得分:1)

您可以使用IIF

SUM(IIF(CW.MRR_Goal = 0, 0, (f.Other1_Revenue + f.Other2_Revenue) / (CW.MRR_Goal))

这样,如果目标等于0,则它将SUM为0,而不是尝试除法,而如果目标不等于0,那么它将进行除法。

有关IIF https://msdn.microsoft.com/en-GB/library/hh213574.aspx

的更多信息

提到的user3540365 IIF仅适用于SQL Server 2012而不是从SQL Server 2008开始应用的CASE,请参阅here并且是SQL标准。