Sql 返回零而不是值
问题:PassedPercent返回0,但在所有情况下,@Started和@Passed都有数值,应该有一个数字我可以确认。相同的公式在.aspx页面上正常工作,但我将其转换为SQL查询 代码:Sql 返回零而不是值,sql,sql-server,Sql,Sql Server,问题:PassedPercent返回0,但在所有情况下,@Started和@Passed都有数值,应该有一个数字我可以确认。相同的公式在.aspx页面上正常工作,但我将其转换为SQL查询 代码: 在本例中,int/int将返回一个int,即零 试一试 在本例中,int/int将返回一个int,即零 试一试 @indofraiser当@PassedCheers时,你问题中的公式将始终返回0,我刚刚删除了我的其他评论,正要问你给出的答案@如果你尝试一下,你可能会感到惊讶。例如,try:选择25/10
在本例中,int/int将返回一个int,即零 试一试
在本例中,int/int将返回一个int,即零 试一试
@indofraiser当@PassedCheers时,你问题中的公式将始终返回0,我刚刚删除了我的其他评论,正要问你给出的答案@如果你尝试一下,你可能会感到惊讶。例如,try:选择25/100,然后尝试选择25.0/100。第一个值将返回零,而第二个值将返回0.25,因此两个值都是整数。系统必须为结果返回1且仅返回一种数据类型。因为它的两个值是整数,所以它使用int,所以得到0。如果仅通过添加.0将1更改为十进制,引擎将选择精度最高的值,并返回一个十进制。或者,您可以在除法发生之前将每个值转换为十进制。在SQLServer中,这种情况通常被称为整数数学,您需要始终注意它。我不相信在Oracle、MySQL或DB2中会发生这种情况。@indofraiser当@PassedCheers时,您问题中的公式将始终返回0,我刚刚删除了我的其他注释,并准备询问您给出的答案@如果你尝试一下,你可能会感到惊讶。例如,try:选择25/100,然后尝试选择25.0/100。第一个值将返回零,而第二个值将返回0.25,因此两个值都是整数。系统必须为结果返回1且仅返回一种数据类型。因为它的两个值是整数,所以它使用int,所以得到0。如果仅通过添加.0将1更改为十进制,引擎将选择精度最高的值,并返回一个十进制。或者,您可以在除法发生之前将每个值转换为十进制。在SQLServer中,这种情况通常被称为整数数学,您需要始终注意它。我不相信在Oracle、MySQL或DB2中会发生这种情况。零是一个数字。@jarlh,但只在足够大的值0上发生pZero是一个数字。@jarlh,但仅限于足够大的值0:P
USE DATABASE
DECLARE @i INT = 0
DECLARE @ModuleID bigint
DECLARE @Started bigint
DECLARE @Completed bigint
DECLARE @Passed bigint
DECLARE merge_cursor CURSOR FAST_FORWARD FOR SELECT [ModuleID] FROM dbo.[TblModules]
--ORDER BY [ModuleID]
OPEN merge_cursor
FETCH NEXT FROM merge_cursor INTO @ModuleID
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Started = (Select Count(ID) FROM [TblResults] WHERE [ModuleID] = @ModuleID)
SET @Completed = (Select Count(ID) FROM [TblResults] WHERE [ModuleID] = @ModuleID and ModuleDatecomplete <> '')
SET @Passed = (Select Count(ID) FROM [TblResults] WHERE [ModuleID] = @ModuleID and Pass = 'Yes')
UPDATE [TblModules] SET [Started] = @Started,[Completed] = @Completed,[Passed] = @Passed,[PassedPercent] = ((@Passed / @Started) * 100)
WHERE [ModuleID] = @ModuleID
FETCH NEXT FROM merge_cursor INTO @ModuleID
END
CLOSE merge_cursor
DEALLOCATE merge_cursor
,[PassedPercent] = (@Passed *100.0) / @Started