两个值的除法返回0而不是正或负十进制

时间:2018-01-08 11:53:16

标签: sql sql-server tsql

我每晚都有一个大型存储过程更新表。它通过一系列更新在更新每个剩余列之前,将大量信息写入临时表。

其中一项更新是一个部门。该部门采用两个先前更新的字段并将它们分开。

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

我知道答案在我眼前会非常简单或恰到好处,但在这个时候我完全不知道为什么会发生这种情况。

由于

3 个答案:

答案 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