当股息和除数的值为零时,将采取何种情况?

时间:2017-12-05 04:37:58

标签: sql sql-server

即使在添加一个案例以使值为null之后,我的查询也会得到除以零的错误。我想这可能是因为a.grosspcs在本月的第一天也是零值。但是,我在最后2个小时的每个方向尝试了这个案例并且它一直在上升。我错过了什么吗?我是否还需要CTE选择语句中的案例?如果a.grosspcs也是零值我做2个案例吗?我还是SQL的新手,所以提前感谢任何帮助。

SELECT datename(MM,a.MonthDate) as Month 

,Sum(a.ScrapPcs) / (Sum(a.GrossPcs)*1.00) As ScrapPct

,0.005 As ScrapTarget

,CASE 
 WHEN Sum(a.ScrapPcs) / (Sum(a.GrossPcs)*1.00) <= 0.005 THEN 1
 WHEN Sum(a.ScrapPcs) / (Sum(a.GrossPcs)*1.00) >= 0.9*.005 THEN -1
 ELSE 0
 END 
 AS Status

,Case
  when a.ScrapPcs=0 then null
Else a.GrossPcs / a.ScrapPcs
 end 

FROM 
(
SELECT DATEADD(month, DATEDIFF(month, 0, b.CreationProdDate), 0) As MonthDate
      ,Count(b.BOOKING_ID) As ScrapPcs
      , 0 As GrossPcs

FROM dbo.CPC_BOOKING b

WHERE b.CreationProdDate Between DATEADD(yy, DATEDIFF(yy, 0, GetDate()), 0) AND DateAdd("d", -1, GetDate())
AND CPC_Level_ID = 37

GROUP BY DATEADD(month, DATEDIFF(month, 0, b.CreationProdDate), 0)

UNION ALL 


SELECT DATEADD(month, DATEDIFF(month, 0, n.date), 0) As MonthDate
      ,0 As ScrapPcs
      ,Sum(n.Processed) As GrossPcs

 FROM [NORIS].[dbo].[USC_CustomerCounts] n

WHERE n.date Between DATEADD(yy, DATEDIFF(yy, 0, GetDate()), 0) AND DateAdd("d", -1, GetDate())
and n.Customer = 'SGM'

GROUP BY DATEADD(month, DATEDIFF(month, 0, n.Date), 0)
) a

group by a.MonthDate,a.GrossPcs, a.ScrapPcs

1 个答案:

答案 0 :(得分:0)

将除数包装在NULLIF()函数

  SELECT 100 / NULLIF( val ,0)  AS foo
--             ^^^^^^^     ^^^ 

在第一个SELECT中,我看到了四个除法运算

第四个,在CASE声明中...我不认为SQL Server在评估之前不会评估ELSE的内容。 WHEN中的条件。

更改此操作,但不保证操作顺序:

  , Case
    when a.ScrapPcs=0 then null
    Else a.GrossPcs / a.ScrapPcs
    end 

到这个

  , a.GrossPcs / NULLIF( a.ScrapPcs ,0)
    --           ^^^^^^^            ^^^

因此保证在除法之前评估NULLIF函数。 (除法之前不能执行除法。)

另外,如果不能保证Sum(a.GrossPcs)不会为零,那么 将该表达式包装在NULLIF中,并将其用作除数。 (或者,将整个除数包装在NULLIF中。)我在SELECT列表中看到该表达式出现三次,其中&#34;除以零&#34;。

    foo  / ( NULLIF( SUM(a.GrossPcs) ,0)*1.00 )
         --  ^^^^^^^                 ^^^