Sql a'中的0除法;其他时间';环境

Sql a'中的0除法;其他时间';环境,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下代码: CASE WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5 Then 1 ELSE 0 当(1+sum(x)/sum(y))>=0且(1+sum(x)/sum(y))=0时 和(1+sum(x)/NullIf(sum(y),0))=0 和(1+sum(x)/sum(coalesce(y,0))=0且(1+sum(x)/sum(y))=0且(1+sum(x)/sum(y))=0和(1+sum(x)/sum(y

我有以下代码:

CASE WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5 Then 1 ELSE 0
当(1+sum(x)/sum(y))>=0且(1+sum(x)/sum(y))<0.5时,则为1,否则为0

x和y是列。我的问题是,
sum(y)
可以是0,我得到的误差除以0是不可能的。如何在else子句中弥补此错误。因此,如果
y=0“ELSE 0”
被激活。

尝试使用表达式
NullIf(sum(y),0)
代替
sum(y)

选择
案例
当(1+sum(x)/NullIf(sum(y),0))>=0时
和(1+sum(x)/NullIf(sum(y),0))<0.5则1
其他0
结束
样本

案例
和(联合(y,0))0
和(1+sum(x)/sum(coalesce(y,0))>=0
和(1+sum(x)/sum(coalesce(y,0))<0.5
1.
其他的
0
结束

可能还有一个条件

CASE 
   WHEN sum(y)=0 then 0
   WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5 Then 1 
   ELSE 0
END
案例
当总和(y)=0时,则为0
当(1+sum(x)/sum(y))>=0且(1+sum(x)/sum(y))<0.5时,则1
其他0
结束

您需要先检查分母是否为零 如果是,则不计算公式返回零 其他的 计算公式

代码:

CASE WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5 Then 1
ELSE 0
当(1+sum(x)/sum(y))>=0且(1+sum(x)/sum(y))<0.5时,则为1
其他0
将其修改为:

CASE
WHEN SUM(isnull(y,0))=0 then 0
ELSE
  CASE
     WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5
     THEN 1
  END
END AS [RESULT]
案例
当SUM(isnull(y,0))=0时,则为0
其他的
案例
当(1+sum(x)/sum(y))>=0和(1+sum(x)/sum(y))<0.5
那么1
结束
以[结果]结束

我认为它不会删除除零异常示例(在您发表评论之前进行设置,好的,没关系,如果没有帮助,可能是我遗漏了什么)@amitshigh它肯定会的。我测试过了。这是一个很好的解决方案+1@t-clausen.dk,如果总和不是零,而是1e,我不确定它将如何运行-17@i-第一:我在评论之前没有设置它不是真的。我尝试了:(sum(x)-NULLIF(sum(day为NULL的情况下,y表示0结束)/CAST(sum(day为NULL的情况下,y表示0结束)作为十进制(18,2)),0)。仍然给我“除以0”的错误。我选择这个解决方案,因为它(对我来说)是最短和最清晰的。非常感谢!我相信,在某些情况下,这可能不足以保护你。现在正在尝试查找相关链接。请参见,尽管在这种情况下,除法在聚合中,但它表明,当第一个
WHEN
计算为真时,第二个
WHEN
的某些计算将发生。
CASE WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5 Then 1
ELSE 0
CASE
WHEN SUM(isnull(y,0))=0 then 0
ELSE
  CASE
     WHEN (1+sum(x)/sum(y)) >=0 and (1+sum(x)/sum(y)) < 0.5
     THEN 1
  END
END AS [RESULT]