Sql 无法获得精确的小数百分比结果?

Sql 无法获得精确的小数百分比结果?,sql,sql-server,stored-procedures,casting,sql-server-2012,Sql,Sql Server,Stored Procedures,Casting,Sql Server 2012,我创建了以下存储过程来计算百分比,它工作得很好,但我始终无法得到准确的结果 例如,98.000而不是98.947 。我相信,要做到这一点,您需要一个实值函数,或者更好的是,正如其他人所指出的,您的过程需要一个十进制输出参数。。我认为,您需要一个实值函数来实现这一点,或者,更好地说,正如其他人所指出的,您的过程需要一个十进制输出参数。另一种可能是使用out参数 Alter PROCEDURE sp_finger_calc_percent(@return_status decimal(18,4) o

我创建了以下存储过程来计算百分比,它工作得很好,但我始终无法得到准确的结果

例如,98.000而不是98.947


。我相信,要做到这一点,您需要一个实值函数,或者更好的是,正如其他人所指出的,您的过程需要一个十进制输出参数。

。我认为,您需要一个实值函数来实现这一点,或者,更好地说,正如其他人所指出的,您的过程需要一个十进制输出参数。

另一种可能是使用out参数

Alter PROCEDURE sp_finger_calc_percent(@return_status decimal(18,4) out)
AS
DECLARE  @no_action decimal(18,4);
DECLARE  @yes_action decimal(18,4);

SELECT   @no_action = COUNT(*)
FROM         Action INNER JOIN
                      Employee ON Action.b_num = Employee.b_num INNER JOIN
                      Department ON Employee.dep_id = Department.dep_id
WHERE     (Department.dep_id = 50) AND (Action.action = 0);


SELECT   @yes_action= COUNT(*)
FROM       Action INNER JOIN
                      Employee ON Action.b_num = Employee.b_num INNER JOIN
                      Department ON Employee.dep_id = Department.dep_id
WHERE     (Department.dep_id = 50) AND (Action.action = 1);

If(@no_action = 0.00)
 select @return_status= 100.00
Else select @return_status = cast( (100.00  *(@yes_action  /@no_action ) )as decimal(18,4)) 
;
召唤


另一种可能是使用out参数

Alter PROCEDURE sp_finger_calc_percent(@return_status decimal(18,4) out)
AS
DECLARE  @no_action decimal(18,4);
DECLARE  @yes_action decimal(18,4);

SELECT   @no_action = COUNT(*)
FROM         Action INNER JOIN
                      Employee ON Action.b_num = Employee.b_num INNER JOIN
                      Department ON Employee.dep_id = Department.dep_id
WHERE     (Department.dep_id = 50) AND (Action.action = 0);


SELECT   @yes_action= COUNT(*)
FROM       Action INNER JOIN
                      Employee ON Action.b_num = Employee.b_num INNER JOIN
                      Department ON Employee.dep_id = Department.dep_id
WHERE     (Department.dep_id = 50) AND (Action.action = 1);

If(@no_action = 0.00)
 select @return_status= 100.00
Else select @return_status = cast( (100.00  *(@yes_action  /@no_action ) )as decimal(18,4)) 
;
召唤


更改为Alex K提到的输出参数:

CREATE PROCEDURE sp_finger_calc_percent
    @RETURNVALUE DECIMAL(18,4) OUTPUT
AS
...
If(@no_action = 0.00)
 SET @RETURNVALUE = 100.00
Else SET @RETURNVALUE = cast( (100.00  *(@yes_action  /@no_action ) )as decimal(18,4)) 
;

更改为Alex K提到的输出参数:

CREATE PROCEDURE sp_finger_calc_percent
    @RETURNVALUE DECIMAL(18,4) OUTPUT
AS
...
If(@no_action = 0.00)
 SET @RETURNVALUE = 100.00
Else SET @RETURNVALUE = cast( (100.00  *(@yes_action  /@no_action ) )as decimal(18,4)) 
;

它应该可以正常工作。返回100.00*@yes\u action/@no\u action作为小数点18,4是正确的,还是返回100.00*@yes\u action/@no\u action+@yes\u action作为小数点18,4?仅供参考,您可以在表格的一次传递中选择@yes\u action=SUMAction.action,@no\u action=SUMcase action.action当0然后1从…结束时,它应该可以正常工作。返回100.00*@yes\u action/@no\u action作为小数点18,4正确,还是返回100.00*@yes\u action/@no\u action+@yes\u action作为小数点18,4正确?仅供参考,您可以在表格的一次传递中选择@yes\u action=SUMAction.action,@no_action=SUMcase action.action当0然后1结束于。。。