1

パーセンテージを計算するために次のストアドプロシージャを作成しますが、正常に動作しますが、常に正確な結果を得ることができません

たとえば、98.000代わりに98.947


CREATE PROCEDURE sp_finger_calc_percent
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)
 return 100.00
Else return cast( (100.00  *(@yes_action  /@no_action ) )as decimal(18,4)) 
;

DECLARE  @return_status decimal(18,4);
EXEC @return_status = sp_finger_calc_percent
select @return_status;
4

3 に答える 3

3

SQL Server のプロシージャは、INTeger 型のみを返すことができます。これを行うには、実数値の関数が必要だと思います (または、他の人が指摘したように、プロシージャへの 10 進数の OUTPUT パラメーター)。

于 2012-11-20T17:04:28.777 に答える
1

別の可能性は、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)) 
;

電話

DECLARE  @return_status decimal(18,4);
EXEC  sp_finger_calc_percent @return_status out
select @return_status;
于 2012-11-20T17:12:18.380 に答える
1

出力パラメーターに変更します (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)) 
;
于 2012-11-20T17:12:44.650 に答える