Sql server 为什么存储过程返回0?
我正在尝试获取Sql server 为什么存储过程返回0?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正在尝试获取PointsNeed列和pointsPossible列的总和。我想把这个变成一个百分比。我的问题是,我的SP始终返回0,即使有具有给定的enrollmentId的行具有前几列的值 我做错了什么 ALTER PROCEDURE GetPercentage @enrollmentId int AS BEGIN DECLARE @pointsEarned int; DECLARE @pointsPossible int; SET NOCOUNT ON;
PointsNeed
列和pointsPossible
列的总和。我想把这个变成一个百分比。我的问题是,我的SP始终返回0,即使有具有给定的enrollmentId
的行具有前几列的值
我做错了什么
ALTER PROCEDURE GetPercentage
@enrollmentId int
AS
BEGIN
DECLARE @pointsEarned int;
DECLARE @pointsPossible int;
SET NOCOUNT ON;
SELECT
@pointsEarned = CAST(SUM(pointsEarned) OVER() AS decimal),
@pointsPossible = CAST(SUM(pointsPossible) OVER() AS decimal)
FROM
Assignments
WHERE
enrollmentId = @enrollmentId
RETURN @pointsEarned / @pointsPossible
END
GO
这是数据库表:
我执行存储过程并传入69的
enrollmentId
,它仍然返回0。分母(pointspobable
)大于分子(pointsEarned
)的整数除法返回零
写为(修订):
正如@Nick.McDermaid指出的,由于此过程返回标量值,因此将其定义为函数而不是存储过程可能更为合适。分母(
点可能
)大于分子(点搜索
)的整数除法返回零
写为(修订):
正如@Nick.McDermaid指出的,由于此过程返回标量值,因此将其定义为函数而不是存储过程可能更合适
SUM
而不使用OVER
RETURN
只能返回int
。如果百分比小于100%,整数除法将始终返回0,因此乘以100将返回整个百分比,而不是比率ALTER PROCEDURE GetPercentage
@enrollmentId int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @pointsEarned int;
DECLARE @pointsPossible int;
SELECT
@pointsEarned = SUM(pointsEarned),
@pointsPossible = SUM(pointsPossible)
FROM
Assignments
WHERE
enrollmentId = @enrollmentId
;
RETURN
CASE WHEN @pointsPossible <> 0
THEN 100 * @pointsEarned / @pointsPossible
ELSE 0 END;
END
GO
ALTER过程获取百分比
@注册ID int
作为
开始
不计数;
声明@pointsEarned int;
声明@pointspobable int;
挑选
@pointsEarned=总和(pointsEarned),
@pointsPossible=总和(pointsPossible)
从…起
作业
哪里
enrollmentId=@enrollmentId
;
返回
@points可能为0时的大小写
然后100*@pointserned/@points可能
否则0结束;
结束
去
SUM
而不使用OVER
RETURN
只能返回int
。如果百分比小于100%,整数除法将始终返回0,因此乘以100将返回整个百分比,而不是比率ALTER PROCEDURE GetPercentage
@enrollmentId int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @pointsEarned int;
DECLARE @pointsPossible int;
SELECT
@pointsEarned = SUM(pointsEarned),
@pointsPossible = SUM(pointsPossible)
FROM
Assignments
WHERE
enrollmentId = @enrollmentId
;
RETURN
CASE WHEN @pointsPossible <> 0
THEN 100 * @pointsEarned / @pointsPossible
ELSE 0 END;
END
GO
ALTER过程获取百分比
@注册ID int
作为
开始
不计数;
声明@pointsEarned int;
声明@pointspobable int;
挑选
@pointsEarned=总和(pointsEarned),
@pointsPossible=总和(pointsPossible)
从…起
作业
哪里
enrollmentId=@enrollmentId
;
返回
@points可能为0时的大小写
然后100*@pointserned/@points可能
否则0结束;
结束
去
我会放弃返回并用select替换它show yourexec
script为什么要放弃返回并用select替换?它无法解决问题,并完全改变了SP的使用。在您的示例中,您希望得到什么结果?我会去掉返回值并用SELECTshow yourexec
script替换它。为什么要去掉返回值并用select
替换?它没有解决问题,完全改变了SP的使用。您希望在您的示例中得到什么结果?@MitchWheat,我想我知道SUM()OVER()
的作用。如果我正确理解这个问题,OP需要一个简单的和(一行一个数字),而不是多行的和。你的意思是像我发布的答案一样?但是关于返回的好观点只能返回一个整数。@MitchWheat,是的,你的答案和我的非常相似。您决定选择结果作为结果集,该结果集可以保存非整数值(十进制
或浮点
)。我离开了原始方法,返回
整数值。顺便说一句,没有必要使用groupby
,因为WHERE
中有过滤器。RE:groupby:“是的,我知道。这是出于习惯。@MitchWheat,我想我知道SUM()OVER()
的作用。如果我正确理解这个问题,OP需要一个简单的和(一行一个数字),不是多行的总和。你的意思是像我发布的答案一样吗?但是返回的好方法只能返回一个整数。@MitchWheat,是的,你和我的答案非常相似。你决定选择结果作为结果集,结果集可以保存非整数值(decimal
或float
).我保留了原始方法,该方法返回整数值。。顺便说一句,没有必要使用分组依据
,因为在中有过滤器。RE:GROUP BY”:是的,我知道。这是出于习惯。