4

次のような T-SQL コードのセクションがあります。

select @automation_rate = 
  case 
    when @total_count = 0 then 0
    else @automated_count / @total_count
  end

@automation_rate は decimal(3,2) です。@total_count と @automated_count は整数です。

残念ながら、@automation_rate に返される値は 0 か 1 だけです。明らかに何か問題があり、ばかばかしいほど単純かもしれませんが、私の人生ではそれを見ることができません。

基になる結果セット (テーブルをループしています) のすべてのデータは、0 または正の整数です。自動化率を除いて、すべての値は整数です。

値の例と、(電卓を使用した) 期待値と実際の結果を次に示します。

automated count     total count     expected ratio     actual ratio
---------------     -----------     --------------     ------------
              0              35                0.0             0.00
             98             258              37.98             0.00
             74             557              13.29             0.00
            140             140               1.00             1.00

ご覧のとおり、automatic = total 以外のすべての値の比率は 0.00 です。また、同じ基本的な計算を行う Excel スプレッドシートもあり、毎回完璧な結果が得られます (つまり、「期待される」列のように)。

それで、どこで間違ったのですか?

(これは MS SQL Server 2005 でのものですが、まったく影響がない可能性があります)

編集回答してくれた皆さんに感謝します。整数の丸め部分は、計算、丸め、そして変換を行うことに気付くのではなく、自動的に変換される 10 進データ型に移行しているためと仮定して吹き飛ばしました。誰もが同様の答えを持っていたので、賛成票を投じました。

4

4 に答える 4

10

This seems to be due to integer math, since @automated_count and @total_count are obviously integers. You need to say:

1.0*@automated_count / @total_count

Or more explicitly:

CONVERT(DECIMAL(5,2), @automated_count) / @total_count

Also these will yield 0.3798 etc. so you might want:

CONVERT(DECIMAL(5,2), 100.0*@automated_count / @total_count)
于 2012-07-03T17:13:10.673 に答える
4

除算で使用される両方の値が整数であるため、整数が返されます。これを機能させるには、そのうちの 1 つを 10 進数にキャストする必要があります。

CONVERT(DECIMAL(6,2),@automated_count) / @total_count
于 2012-07-03T17:14:49.063 に答える
2

整数で計算すると、SQL Server は丸めます。

試す:

    select @automation_rate =
    case
      when @total_count = 0 then 0.00
     else (@automated_count * 1.00) / @total_count
   end
于 2012-07-03T17:14:47.330 に答える
1

切り捨てています。すべての int を処理し、double を処理しないものは、常に int に切り詰められます。0.x は 0 になります。

于 2012-07-03T17:15:45.000 に答える