使用CAST转换为BIGINT仍遇算术溢出错误,请求排查SQL问题
解决SQL算术溢出错误(Arithmetic overflow error converting expression to data type int)
问题根源
你虽然在除法步骤中将求和结果转换为BIGINT,但求和操作本身是基于原字段的INT类型执行的。当sum(da.ASSISTS)或sum(da.acdcalls)的计算结果超过INT类型的最大值(2147483647)时,求和过程中就会触发算术溢出,后续的CAST无法修复这个提前发生的错误。
解决方案
在求和操作前,先将字段转换为BIGINT类型,确保求和计算全程使用大整数类型,避免溢出:
修改后的完整SQL代码
SELECT MONTH(ROW_DATE) AS Month, CAST(SUM(CAST(da.ASSISTS AS BIGINT)) AS BIGINT) / CAST(NULLIF(SUM(CAST(da.acdcalls AS BIGINT)), 0) AS BIGINT) AS [Assist%] FROM [D998AA0_TELECOM].[APD_TEL].[TCMS_DAGENT] da JOIN [D998AA0_TELECOM].[CentralDWH].[Sessions_booked] sb ON sb.PBX_id = da.LOGID JOIN [D998AA0_TELECOM].[APD_TEL].[TCMS_SKILL_DIM_KEY_NEW] dk ON CAST(dk.HuntGrpExt AS CHAR) = sb.p7_value WHERE IEXSkillName IN ('Universal', 'Tracking','Shipping') AND Channel = 'Phone' AND Country = 'US' AND [ROW_DATE] NOT LIKE '%C%' AND CONVERT(DATE, ROW_DATE) BETWEEN '2022-01-01' AND '2022-01-31' GROUP BY MONTH(ROW_DATE) ORDER BY MONTH(ROW_DATE)
可选方案(需权限)
如果业务允许,直接将da.ASSISTS和da.acdcalls字段的数据类型修改为BIGINT,从根源上避免后续求和操作的溢出问题。
验证点
检查TCMS_DAGENT表中ASSISTS和acdcalls字段的数据类型,若为INT则使用上述方案1即可解决;若字段已是BIGINT,需排查JOIN逻辑是否导致数据异常重复,进而使求和结果超出预期。
内容的提问来源于stack exchange,提问作者Riddhi Solanki
相关产品推荐
相关产品推荐

