算术溢出或其他算术异常发生的解决方案?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算术溢出或其他算术异常发生的解决方案?相关的知识,希望对你有一定的参考价值。

我正在使用db2,不知道是什么版本。在尝试对表进行求和时,我遇到溢出错误。我认为我可以将总和转换为BIGINT,这似乎适用于总和,但我希望获得一个百分比,当我转换为BIGINT时,我的数据是不准确的。如何获得Percent_DeliveredB / A的准确百分比?将分子和分母转换为BIGINT并除以百分比并不能给我正确的结果。

这是我的脚本:

SELECT 
FAT.DIM_BUILDING_ID,
FAT.BUILDING_NAME,
SUM(CAST(FAT.AMOUNT AS BIGINT)) AS SALES_SUM,
SUM(CAST(FAT.ORDERS AS BIGINT)) AS ORDERS_SUM,
SUM(CAST(FAT.CAPABILITY AS BIGINT)) AS CAPABILITY_SUM,
SUM(FAT.ORDERS_B)/sum(FAT.Amount) AS Percent_DeliveredB,
SUM(FAT.ORDERS_A)/sum(FAT.Amount) AS Percent_DeliveredA,
SUM(CAST(FTS.GROUP_A AS BIGINT)) AS GROUP_A,
SUM(CAST(FTS.GROUP_B AS BIGINT)) AS GROUP_B,
SUM(CAST(FTS.GROUP_C AS BIGINT)) AS GROUP_C  

FROM ORDERS AS FAT
INNER JOIN GROUPS AS FTS ON FAT.DIM_PROJECT_ID = FTS.DIM_PROJECT_ID
GROUP BY FAT.DIM_BUILDING_ID, FAT.BUILDING_NAME;

我尝试了以下但是它返回0为百分比。

SUM(CAST(FAT.ORDERS_B AS BIGINT))/sum(CAST(FAT.Amount AS BIGINT)) AS Percent_DeliveredB
答案

我能够将正确的结果转换为双倍。

SUM(CAST(FAT.ORDERS_B AS DOUBLE))/sum(CAST(FAT.Amount AS DOUBLE)) AS Percent_DeliveredB,
另一答案

它给你一个正确的结果,因为任何小于1的值,当转换为整数(或BIGINT)时,显然会被截断为0。如果您期望分数,请使用DECIMAL或FLOAT数据类型:

cast(SUM(FAT.ORDERS_B) as decimal(10,2)) / 
cast(sum(FAT.Amount) as decimal(10,2)) AS Percent_DeliveredB

当然,请根据您的需要使用正确的精度。

另一答案

我在一张非常大的桌子上使用select count(*)时遇到了同样的错误。

我通过使用count_big(*)解决了它,它可以处理超过2.147.483.647(MAX_LONGINT_INT SQL限制)的计数。

以上是关于算术溢出或其他算术异常发生的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

将 expression 转换为数据类型 datetime 时发生算术溢出错误,如果是数据问题改该怎么解决?

速达软件提示将numeric转换为数据类型numeric时发生算术溢出错误

速达 将numeric转换为数据类型numeric时发生算术溢出错误

如何正式验证 "没有算术或其他异常"?

将expression转化为数据类型int时发生算术溢出错误

类型varchar值= 770214566.000000000的算术溢出错误