T-SQL AVG舍入浮点结果

时间:2014-05-28 08:19:57

标签: tsql floating-point average rounding

我有一个很大的存储过程,一些嵌套游标以一种方式获取一些参数。在这部分我得到了问题:

DECLARE @Avg_Dev float;

SET @sqlstatement = 'SELECT @Avg_Dev = AVG([' + @QLabel + ']) 
                    FROM Imported_Data 
                    WHERE BrandID = ''' + CAST(@BrandID AS nvarchar(max)) + ''' AND CountryID = ''' + CAST(@CountryID AS nvarchar(max)) 
                    + ''' AND [Year] = ''' + CAST(@Year AS nvarchar(max))
                    + ''' AND ' + CAST(@QLabel AS nvarchar(max)) + ' <> ''' + CAST(@NoAnswer AS nvarchar(max)) + ''' ' + @Query;
EXEC sp_executesql @sqlstatement, N'@Avg_Dev float output', @Avg_Dev output;
PRINT 'AVG Check'; PRINT @Avg_Dev;

@BrandID@CountryIDGUID@Yearint@QLabelint@Querynvarchar(max)@NoAnswer包含一个不需要考虑的特殊值。 @QLabel包含我正在处理的列。 @Query包含要应用于where语句的条件,并且每个@QLabel都有所不同。问题是@Avg_Dev总是包含四舍五入到最接近的整数的值,我看不出原因。 @QLabel可以是1到10之间的值。 我知道这不容易阅读,但我发现没有其他方法可以动态处理表格,每个参数经常变化。

1 个答案:

答案 0 :(得分:1)

这里的问题是列(QLabel)被定义为整数。因此AVG()将返回一个整数(忽略小数)并将其推入浮点变量。试试这个:

SET @sqlstatement = 'SELECT @Avg_Dev = AVG(convert(float,[' + @QLabel + '])) 
                    FROM Imported_Data 
                    WHERE BrandID = ''' + CAST(@BrandID AS nvarchar(max)) + ''' AND CountryID = ''' + CAST(@CountryID AS nvarchar(max)) 
                    + ''' AND [Year] = ''' + CAST(@Year AS nvarchar(max))
                    + ''' AND ' + CAST(@QLabel AS nvarchar(max)) + ' <> ''' + CAST(@NoAnswer AS nvarchar(max)) + ''' ' + @Query;