1

我正在尝试使用 NULLIF 函数返回一个 NULL 值,其中我的查询的除数为零,因此返回除以零错误。但是,我无法将函数包装在我的语句周围。该语句包含 CAST、CASE 和 SUM 函数。我在下面的示例中将函数包装在除数周围,但这不起作用,我尝试了其他组合。

cast(
  round(
      cast(
          sum(
              case 
                  when @StuYear=11 AND [Levels of Progress] < 3 then 
                      1 
              when @StuYear=10 AND [Levels of Progress] < 2 then 
                      1
              when @StuYear=9 AND [Levels of Progress] < 1 then 
                      1
          else 
                      0 
              end) as decimal)
/
NULLIF(
cast(
    sum(
        case
            when [Levels of Progress] is NULL then 
                0 
            else 
                1 
        end) as decimal) * 100,1) as numeric(4,1))
,0)
4

3 回答 3

1
Cast(
  Sum(
    CASE WHEN (@StuYear = 11 AND [Levels of Progress] < 3)
           OR (@StuYear = 10 AND [Levels of Progress] < 2)
           OR (@StuYear =  9 AND [Levels of Progress] < 1)
      THEN 1
      ELSE 0
    END
  )
, As decimal)

/

NullIf(
  Cast(
    Sum(
      CASE WHEN [Levels of Progress] IS NULL
        THEN 0
        ELSE 1
      END
    )
  , As decimal)
, 0)

Sum()或者,我们可以NULL通过不将“零”相加来强制实现。我们查询的后半部分变成:

Cast(
  Sum(
    CASE WHEN [Levels of Progress] IS NOT NULL
      THEN 1
    END
  )
, As decimal)

顺便; 如果您将来遇到此问题,那么最好将您的值拆分为单独的列以进行调试。

于 2013-11-05T09:40:56.597 回答
1

您发布的语法无效且难以阅读,而且您的逻辑似乎是错误的。

试试这个:

declare @stuyear int = 11
select
  cast(
    sum(
      case when @StuYear=11 and [Levels of Progress] < 3 or 
                @StuYear=10 and [Levels of Progress] < 2 or
                @StuYear=9  and [Levels of Progress] < 1 then 1
         else 0 end
     )*100.0 /
    NULLIF(count([Levels of Progress]),0)
  as Numeric(5,2))
from (values (cast(null as int))) x([Levels of Progress])

用您自己的表替换 from 部分。这是一个有效的语法,当计数为 null 时返回 null。

于 2013-11-05T10:32:51.790 回答
-1

为什么不使用 TRY ... CATCH 并控制代码流?

begin try
    print 55/0; -- your code would go here
end try
begin catch
    print Error_Message(); -- do what you need to do here on a divide by zero
end catch
于 2013-11-05T09:21:55.083 回答