0

ある人が調査に回答した回数を示す表があります。人idとはsurvey idですvarchar(10)。返信された列は、無応答または応答のいずれintかであり、です。次のようになります。01databaseIdvarchar(2)

  personId       surveyId         replied      databaseId
    0001           1366              0             3
    0002           2243              1             1
    0003           6693              0             2
    0004           1246              0             1
    0045           2740              1             4
    ....           ....             ...           ...

調査の回答率に関する要約統計量を取得しようとしていますがINSERT、結果を新しいテーブルにしようとするとエラーが発生します。新しいテーブルの形式は次のとおりです。

 surveyId        respRate
     1366            0.00000
     2243            0.00832
     2244            0.02377
     8875            0.01534
     ....              ...

ここsurveyIdvarchar(20)respRatedecimal(5,5)です。以下を使用して新しいテーブルに挿入しようとすると、次のようになります。

insert into summaryTable
  (surveyId, meanrr)  
  SELECT  t1.surveyId
  ,(sum(t1.replied)*1.0 / count(replied)*1.0) meanrr
  FROM (select * from table1 
  where databaseid in ('1','2','3')) t1
  where surveyId is not null
  group by surveyId 

次のエラーメッセージが表示されます。

Msg 8115, Level 16, State 8, Line 8
Arithmetic overflow error converting numeric to data type numeric.

私はこれについていくつかの調査を行いましたが、ターゲット列のサイズを大きくする以外に多くのことは見つかりませんでした(つまりdecimal(5,5)-> decimal(10,10))が、これを試したときに同じ応答が得られました。

クエリ部分をその部分なしで試してみると、insert intoうまくいくようです(またはエラーメッセージが表示されません)。

他に何か提案はありますか?

4

2 に答える 2

1

暗黙の副作用(*1.0)の代わりに特定のキャストを使用して、値を変換します。次に例を示します。

cast(
  cast(sum(t1.replied) as float) / cast(count(replied) as float)
  as decimal(6,5)
) meanrr
于 2012-09-12T14:21:13.327 に答える
1

現在のデータ型decimal (5,5)では1の値は許可されません。これは、基本的に合計5桁を意味し、すべて小数点の右側にあります。

あなたの行の1つが100%の応答率を持っていると推測しています。これは1.0000、オーバーフローの原因になります。

decimal (6,5)整数を許可するようなデータ型を試してください。

于 2012-09-12T14:25:15.523 に答える