对于没有数据的查询,除以零错误返回

时间:2014-01-23 17:24:07

标签: c# asp.net sql gridview sql-server-2012

我正在试图找出一种通过零误差来解决这个鸿沟的方法。我面临的当前挑战来自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#。

我知道这可能是非常简单的事情,但我现在只是在转动我的车轮。

3 个答案:

答案 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条件中的那一部分。