即使在添加一个案例以使值为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
答案 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 )
-- ^^^^^^^ ^^^