我正在创建一些报告,这些报告需要一个有限的总计(比方说2,500)产品(例如冰淇淋甜筒),并计算在服务之前它们中有多少被破坏了。
现在,我已经失败了实际的破碎锥体计数代码。
SELECT COUNT(broken_cones) FROM [ice].[ice_cream_inventory]
WHERE broken_cones = 'Yes'
但是,我需要一定比例的破碎锥体。我一直在玩这个代码,但我一直在遇到“零除零”的问题。以下代码出错。
SELECT CAST(NULLIF((.01 * 2500)/Count(broken_cones), 0) AS
decimal(7,4)) FROM [ice].[ice_cream_inventory] WHERE broken_cones = 'Yes'
目前,没有任何破碎的锥体(并且暂时不会),所以现在总数为零。如何将NULL场景显示为零?
我试图在混合中添加一个ISNULL语句,但我不断得到'除以零'错误。我甚至这样做了吗?
::编辑::
这是我最终的结果。
SELECT
CASE
WHEN COUNT(broken_cones) = 0 then 0
ELSE CAST(NULLIF((.01 * 2500)/Count(broken_cones), 0) AS decimal(7,4))
END
FROM [ice].[ice_cream_inventory] WHERE broken_cones = 'Yes'
答案 0 :(得分:12)
使用案例陈述。
SELECT
CASE WHEN COUNT(broken_cones) = 0 then 0
ELSE CAST(NULLIF((.01 * 2500)/Count(broken_cones), 0) AS decimal(7,4)) END
FROM [ice].[ice_cream_inventory] WHERE broken_cones = 'Yes'
答案 1 :(得分:4)
您已经有了解决方案,但这就是原始解决方案不起作用的原因。
您的NULLIF需要移动才能生效。它在进入NULLIF调用之前正在进行除法。除以null将返回空值。
SELECT CAST((.01 * 2500)/NULLIF(Count(broken_cones), 0) AS decimal(7,4))
FROM [ice].[ice_cream_inventory]
WHERE broken_cones = 'Yes'`
答案 2 :(得分:1)
NULLIF()
函数是防止除以零的好方法,因为任何除以NULL
的值都会返回null。使用它的方法如下:
<expression> / NULLIF( <expression>, 0 )
不幸的是,你已经将整个除法表达式包裹在NULLIF()
中,这就是为什么它不适合你。因此,如果您的NULL
返回零,则第一步是让它返回COUNT()
:
SELECT
(0.01 * 2500) / NULLIF( COUNT(broken_cones), 0 )
FROM [ice].[ice_cream_inventory]
WHERE broken_cones = 'Yes'
现在你说你想让NULL回零吗?这是您使用ISNULL()
:
ISNULL(<expression1>, <expression2>)
如果第一个表达式为NULL,则返回第二个表达式,因此我们的SQL现在变为:
SELECT
ISNULL(
(0.01 * 2500) / NULLIF( COUNT(broken_cones), 0 ),
0
)
FROM [ice].[ice_cream_inventory]
WHERE broken_cones = 'Yes'