SQL Case语句在用作红利时返回0

时间:2015-07-14 19:54:36

标签: sql case divide-by-zero

我在SQL中有一个case语句,它本身可以很好地工作(返回一个预期的非零数字),但是当我尝试用它来划分另一个表达式时,它给出了0除以0的错误。这是一个非常基本的总和(案例值1,当99999然后valueA else 0结束)语句。基本上,这就是我所拥有的:

select 

sum(case value1 when 99999 then valueA else 0 end) as [Value 1],

(sum(case value2 when 99999 then valueB else 0 end)) / (sum(case value1 when 99999 then valueA else 0 end)) as [Value 2]

有没有人知道为什么这不起作用?任何帮助将非常感激!

2 个答案:

答案 0 :(得分:0)

这基本上由评论覆盖,但你的红利不需要为0.所以如果它不是99999那么你会得到0/1 = 0而不是0/0 =除以零错误。

{{1}}

答案 1 :(得分:0)

在某些情况下,您可以获得零除错误。在这里,我将字段更改为变量,并将它们设置为行生成错误的条件。只需陷入零值分母。

DECLARE @value1 int
DECLARE @valueA int

DECLARE @value2 int
DECLARE @valueB int

SET @value2 = 99999
SET @valueB = 13

SET @value1 = 99998
SET @valueA = 7

SELECT
    sum(case @value1 when 99999 then @valueA else 0 end) as [Value 1],

    (sum(case @value2 when 99999 then @valueB else 0 end)) AS [Numerator],
    (sum(case @value1 when 99999 then @valueA else 0 end)) as [Denominator], 

    --(sum(case @value2 when 99999 then @valueB else 0 end)) / (sum(case @value1 when 99999 then @valueA else 0 end)) as [Value 2], --your line that may return an error
    [My Value 2] = CASE WHEN (sum(case @value1 when 99999 then @valueA else 0 end)) = 0 THEN
        --'undefined'
        0
    ELSE
        --CONVERT(nvarchar(max), 
            (sum(case @value2 when 99999 then @valueB else 0 end)) / (sum(case @value1 when 99999 then @valueA else 0 end))
        --  )
    END