我每晚都有一个大型存储过程更新表。它通过一系列更新在更新每个剩余列之前,将大量信息写入临时表。
其中一项更新是一个部门。该部门采用两个先前更新的字段并将它们分开。
UPDATE C
SET C.RETURN_ON_SALES = C.TW_UNIT_SALES / C.DISTRIBUTION
FROM
#custTop150 C
#custTop150中的列定义如下:
RETURN_ON_SALES DECIMAL(5,2) NULL
TW_UNIT_SALES INT NULL
[DISTRIBUTION] INT NULL
此更新的所有结果均返回0.00。为了举例说明它正在计算的一些分歧:
7 / 41 | Returns 0.00 when it should return 0.17073170731
11 / 41 | Returns 0.00 when it should return 0.26829268292
9 / 41 | Returns 0.00 when it should return 0.21941219512
5 / 38 | Returns 0.00 when it should return 0.13157894736
我知道答案在我眼前会非常简单或恰到好处,但在这个时候我完全不知道为什么会发生这种情况。
由于
答案 0 :(得分:1)
尝试这个:您的列似乎被定义为INTEGER
,并且在分区中它应该以{{1}}值返回,因此为此我们可以简单地更改操作数之一使用DECIMAL
的{{1}}值,它将返回DECIMAL
值,如下所示
CAST
答案 1 :(得分:1)
猜猜你正在研究SQL Server。然后将RETURN_ON_SALES更改为十进制(10,10)并将输入CAST或将其数据类型更改为DECIMAL
DECLARE @RETURN_ON_SALES decimal(10,10);
DECLARE @TW_UNIT_SALES INT ;
DECLARE @DISTRIBUTION INT ;
SET @TW_UNIT_SALES=7;
SET @DISTRIBUTION=41;
SET @RETURN_ON_SALES=CAST(@TW_UNIT_SALES AS DECIMAL (10,5))/ CAST (@DISTRIBUTION AS DECIMAL(10,5));
PRINT @RETURN_ON_SALES;
答案 2 :(得分:0)
试试这个:
UPDATE C
SET C.RETURN_ON_SALES = 1.0 * C.TW_UNIT_SALES / C.DISTRIBUTION
FROM
#custTop150 C
请注意,1.0
将导致转换在分配给目标变量之前浮动。
您没有指定哪个DBMS,为了确保它有效,您也可以尝试以下方法(如果以前仍然不起作用):
UPDATE C
SET C.RETURN_ON_SALES = (1.0 * C.TW_UNIT_SALES) / (1.0 * C.DISTRIBUTION)
FROM
#custTop150 C