SQL DB2 - 算术溢出(不能将3列相乘)

时间:2017-11-16 05:12:51

标签: casting type-conversion db2 arithmetic-expressions

我试图将3列彼此相乘,但我一直收到算术溢出错误。 2列彼此相乘很好,但是当我尝试乘以另一列时,我收到错误。

select
account AS ACCOUNT,
amount * fee AS "TOTAL AMOUNT",
(amount * fee) * rate AS "FINAL AMOUNT"

在此代码中,FINAL AMOUNT不会计算。我认为它可能是演员或转换或我的语法,但我不确定。第一个字段(金额)存储为十进制(24,6),费用和费率字段存储为十进制(15,9)

请帮忙!

1 个答案:

答案 0 :(得分:0)

十进制算术遵循某些规则......

特别是乘法和除法可以极大地提高结果的精度和规模。

  

SQL中的十进制算术
   以下公式定义SQL中十进制操作结果的精度和小数位数。

     

符号p和s表示第一个操作数的精度和小数位数   符号p'和s'表示第二个的精度和比例   操作数。符号mp表示最大精度。 mp的值   如果是,则为63:
   - p或p'大于31或
   - 为最大精度明确指定值63。否则,mp的值为31.
  符号ms表示最大比例。默认   ms的值为31. ms可以显式设置为0到0之间的任何数字   最高精度   的乘法
  乘法结果的精度为min(mp,p + p'),刻度为min(ms,s + s')。

注意mp为63,ms为31可能特定于Db2 for i v5.4 + ...您的平台/版本可能不同

所以对于你的列(p,s) 金额(24,6) 费用(15,9) 率(15,9)

金额*费用=(39,15)*费率=(54,24)......

您正在处理的实际值是多少,您的结果可能是小数点左边的(52-24)= 30位?

我怀疑你不需要24位小数......

请查看TRUNC()CAST()以修剪小数位,可能与ROUND()一起使用。