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 に答える