【问题标题】:Msg 8115 Arithmetic overflow error when I am trying to convert a balance amountMsg 8115 当我尝试转换余额时出现算术溢出错误
【发布时间】:2018-03-06 21:50:19
【问题描述】:

我需要一些帮助。我在 sql 2012 中创建了一个视图,该视图将获取人员 id# 并显示输入日期和在该日期输入的余额。我尝试过转换余额,甚至尝试将输入日期和余额金额字段从 10 增加。

我文件中的 balance_amount 小数点前不超过 5 位,小数点后不超过 6 位。

我需要的输出是:

people_org_code_id | entry_date1 | balance1 | entry_date2 | balance2
--------------------------------------------------------------------
001234567            01/01/2018     2455.33   02/26/2018     358.33
005212222            01/24/2018     25.00           

以此类推,直到达到 entry_date15 和 balance15。

我目前的代码是:

    SELECT people_org_code_id, 
   [entry_date1]      AS entry_date1, 
   [balance_amount1]  AS balance1, 
   [entry_date2]      AS entry_date2, 
   [balance_amount2]  AS balance2, 
   [entry_date3]      AS entry_date3, 
   [balance_amount3]  AS balance3, 
   [entry_date4]      AS entry_date4, 
   [balance_amount4]  AS balance4, 
   [entry_date5]      AS entry_date5, 
   [balance_amount5]  AS balance5, 
   [entry_date6]      AS entry_date6, 
   [balance_amount6]  AS balance6, 
   [entry_date7]      AS entry_date7, 
   [balance_amount7]  AS balance7, 
   [entry_date8]      AS entry_date8, 
   [balance_amount8]  AS balance8, 
   [entry_date9]      AS entry_date9, 
   [balance_amount9]  AS balance9, 
   [entry_date10]     AS entry_date10, 
   [balance_amount10] AS balance_amount10, 
   [entry_date11]     AS entry_date11, 
   [balance_amount11] AS balance_amount11, 
   [entry_date12]     AS entry_date12, 
   [balance_amount12] AS balance_amount12, 
   [entry_date13]     AS entry_date13, 
   [balance_amount13] AS balance_amount13, 
   [entry_date14]     AS entry_date14, 
   [balance_amount14] AS balance_amount14, 
   [entry_date15]     AS entry_date15, 
   [balance_amount15] AS balance_amount15 
   FROM  (SELECT people_org_code_id, 
          col + '_' + CONVERT(NVARCHAR(2), rw, 1) AS col, 
          val 
   FROM   (SELECT cc.people_org_code_id, 
                  CONVERT(NVARCHAR(13), Cast(cc.entry_date AS DATE), 1) 
                  AS 
                  entry_date, 
                  CONVERT(NVARCHAR(13), Cast( 
                  cc.balance_amount AS decimal(5,2))) AS balance_amt, 
                  Row_number() 
                    OVER( 
                      partition BY cc.people_org_code_id 
                      ORDER BY cc.entry_date) 
                  AS rw 
           FROM   chargecredit cc) AS q1 
  UNPIVOT (val 
  FOR col IN (entry_date, balance_amt)) AS u1) x 
  PIVOT (Max(val) 
  FOR col IN ([entry_date1], 
                    [balance_amount1], 
                    [entry_date2], 
                    [balance_amount2], 
                    [entry_date3], 
                    [balance_amount3], 
                    [entry_date4], 
                    [balance_amount4], 
                    [entry_date5], 
                    [balance_amount5], 
                    [entry_date6], 
                    [balance_amount6], 
                    [entry_date7], 
                    [balance_amount7], 
                    [entry_date8], 
                    [balance_amount8], 
                    [entry_date9], 
                    [balance_amount9], 
                    [entry_date10], 
                    [balance_amount10], 
                    [entry_date11], 
                    [balance_amount11], 
                    [entry_date12], 
                    [balance_amount12], 
                    [entry_date13], 
                    [balance_amount13], 
                    [entry_date14], 
                    [balance_amount14], 
                    [entry_date15], 
                    [balance_amount15] )) p1 

【问题讨论】:

  • 您是否尝试过单独运行转换查询?我看到 3 个转换查询,rw 总是 2 个字符?
  • @AmanB 是的 rw 始终为 2(任何人获得的最高值是 15,因此它将始终为 2),是的,我单独运行了转换查询。问题是这一行: CONVERT(NVARCHAR(13), Cast( cc.balance_amount AS decimal(5,2))) AS balance_amt 这给了我问题

标签: sql sql-server math overflowexception


【解决方案1】:

您需要将您的演员表更改为 Cast(cc.balance_amount AS decimal(11,6))

十进制数据类型定义如下:

DECIMAL(精度,比例)

精度是数字中的位数。规模是数量 数字中小数点右边的数字。例如, 数字 123.45 的精度为 5,小数位数为 2。

欲了解更多信息,请参阅https://docs.microsoft.com/en-us/sql/t-sql/data-types/precision-scale-and-length-transact-sql

【讨论】:

  • 谢谢,但在发布之前我确实将其设置为“cast(cc.balance_amount as decimal(11,6)”,但仍然收到 MSG 8115 算术溢出错误
  • 您是否尝试过将其转换为十进制转换(cc.balance_amount 为十进制)?
  • 或尝试转换而不是投射
  • 是的,如果我这样做,我会收到一个新的错误消息 8167,说明 balance_amt 的列类型与其他列冲突
  • 只使用转换也会产生算术溢出错误
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多