【问题标题】:SQL Server Integer Arithmetic and Insert IssuesSQL Server 整数算术和插入问题
【发布时间】:2012-09-12 14:12:47
【问题描述】:

我有一张表格,显示一个人对调查的回复次数。该人的idsurvey idvarchar(10) 的。回复的列是int,即0 无响应或1 响应,databaseIdvarchar(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 部分的查询部分,它似乎可以工作(或者我只是没有收到错误消息)。

还有其他建议吗?

【问题讨论】:

  • 尝试进一步分解它 - 如果您删除除法和 *1.0 并插入 sum(t1.replied) 会怎样?你得到同样的错误吗?

标签: sql sql-server int decimal


【解决方案1】:

您当前的数据类型decimal (5,5) 不允许值为 1。它基本上意味着总共 5 个数字,所有数字都在小数点右侧。

我猜你的某一行有 100% 的响应率,这将是 1.0000 并导致溢出。

尝试使用像 decimal (6,5) 这样允许整数的数据类型。

【讨论】:

    【解决方案2】:

    使用特定的强制转换而不是隐式的副作用 (*1.0) 来转换值,例如:

    cast(
      cast(sum(t1.replied) as float) / cast(count(replied) as float)
      as decimal(6,5)
    ) meanrr
    

    【讨论】:

    • @JNK:是的,没错,这可能是导致特定错误消息的原因。执行cast(1.0 as decimal(5,5)) 确实会产生相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2018-09-25
    相关资源
    最近更新 更多