整数相除返回0而非小数:存储过程计算异常求助
解决整数除法导致结果为0.00的问题
嘿,这个问题我太熟了——这是SQL里经典的整数除法陷阱!
问题根源
你的TW_UNIT_SALES和DISTRIBUTION都是INT类型,在SQL中,当两个整数进行除法运算时,会执行整数除法:结果只保留整数部分,小数部分直接被截断。比如7/41的整数除法结果是0,之后再把这个0存入DECIMAL(5,2)类型的RETURN_ON_SALES字段,自然就变成0.00了。
解决方案
只需要把其中一个操作数转换为浮点型或小数类型,让SQL执行浮点除法而非整数除法就行,这里给你几种可行的修改方式:
方法1:显式转换其中一个字段为DECIMAL
UPDATE C SET C.RETURN_ON_SALES = CAST(C.TW_UNIT_SALES AS DECIMAL(10,2)) / C.DISTRIBUTION FROM #custTop150 C
这里把TW_UNIT_SALES转成DECIMAL(10,2),除法运算就会以小数精度计算,结果再存入RETURN_ON_SALES时就能保留正确的小数位。
方法2:用1.0触发隐式转换
更简洁的写法,给其中一个整数乘以1.0(浮点型),强制SQL用浮点运算:
UPDATE C SET C.RETURN_ON_SALES = C.TW_UNIT_SALES * 1.0 / C.DISTRIBUTION FROM #custTop150 C
额外提醒:处理除数为0的情况
如果DISTRIBUTION可能为0,直接除法会报错,建议用NULLIF把0转为NULL,避免报错:
UPDATE C SET C.RETURN_ON_SALES = CAST(C.TW_UNIT_SALES AS DECIMAL(10,2)) / NULLIF(C.DISTRIBUTION, 0) FROM #custTop150 C
这样当DISTRIBUTION为0时,RETURN_ON_SALES会被设为NULL,符合字段的NULL定义。
内容的提问来源于stack exchange,提问作者dmoney
相关产品推荐
相关产品推荐

