我正在试图找出一种通过零误差来解决这个鸿沟的方法。我面临的当前挑战来自this question I asked not too long ago.
以下是我正在使用的代码,我正在插入延伸到年底的报告:
SELECT CAST(ROUND((.01 * 2541) / Count(date_record_entered), 1) AS decimal(5,1))
FROM dbo.tablename
WHERE date_record_entered IS NOT NULL
and date_record_entered >= 20131201
AND date_record_entered <= 20131231
对于当前或上个月的报告,数据填充没有任何问题。但是,当访问当前月份的报告时,我在SQL中遇到以下错误(以及C#/ ASP.NET中的类似错误):
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered
这是我尝试过的,但没有成功。
样本#1
SELECT CASE WHEN date_record_entered = 0 then null
ELSE CAST(ROUND(.01 * 2541 / COUNT(date_record_entered),
AS deciamal (5,1)
FROM dbo.tablename
WHERE date_record_entered IS NOT NULL
AND date_record_entered >= 20140201
and date_record_entered <= 20140228
样本#2
SELECT CAST(ROUND((.01 * 2541) / NULLIF(Count(date_record_entered), 1)
AS decimal(5,1)))
FROM dbo.tablename
WHERE date_record_entered IS NOT NULL
and date_record_entered >= 20140201
AND date_record_entered <= 20140228
样本#3
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
SELECT CAST(ROUND(.01 * 2541 / COUNT(date_record_entered ), 1) AS decimal(5,1))
FROM dbo.tablename
WHERE date_record_entered IS NOT NULL
AND date_record_entered >= 20140201
and date_record_entered <= 20140228
现在第三个在SQL中运行,但我还没有找到一种方法来使用gridview / c#。
我知道这可能是非常简单的事情,但我现在只是在转动我的车轮。
答案 0 :(得分:1)
第二种解决方案尝试不应该......
SELECT CASE WHEN COUNT(date_record_entered) = 0 then null ELSE CAST(ROUND(.01 * 2541 / COUNT(date_record_entered), AS decimal (5,1)) END FROM dbo.tablename WHERE date_record_entered IS NOT NULL AND date_record_entered >= 140201 and date_record_entered <= 140228
在CASE WHEN中使用COUNT()
答案 1 :(得分:1)
示例2具有:NULLIF(Count(date_record_entered),1)
相反,请尝试:NULLIF(Count(date_record_entered),0)
NULLIF将返回第一个参数中的值,除非它等于第二个参数中的值。如果它们相等,则NULLIF返回NULL。
SELECT CAST(ROUND((.01 * 2541) / NULLIF(Count(date_record_entered), 1), 0) AS decimal(5,1))
FROM dbo.tablename
WHERE date_record_entered IS NOT NULL
and date_record_entered >= 20140201
AND date_record_entered <= 20140228
答案 2 :(得分:1)
使用NULLIF()
有效,因为除以NULL
会返回NULL
:
SELECT CAST((.01 * 2541) / NULLIF(COUNT(date_record_entered), 0) AS DECIMAL(5,1))
FROM dbo.tablename
WHERE date_record_entered >= 20131201
AND date_record_entered <= 20131231
使用CASE
:
SELECT CASE WHEN COUNT(date_record_entered) = 0 THEN NULL
ELSE CAST((.01 * 2541) / COUNT(date_record_entered) AS DECIMAL(5,1))
END
FROM dbo.tablename
WHERE date_record_entered >= 20140201
AND date_record_entered <= 20140228
通常可以避免抑制警告。 date_record_entered
永远不能同时为NULL
并且在两个日期之间,因此我删除了WHERE
条件中的那一部分。