T-SQL平均舍入为最接近的整数

时间:2011-08-15 10:33:32

标签: sql sql-server tsql

我不确定之前是否曾经问过这个问题,但是如何将平均值四舍五入到T-SQL中最接近的整数?

由于

7 个答案:

答案 0 :(得分:16)

这应该这样做。您可能需要在结束时使用GROUP BY,具体取决于您要查找的平均值。

SELECT CONVERT(int,ROUND(AVG(ColumnName),0))
FROM 
TableName
编辑:这个问题比我最初想的更有趣。

如果我们设置这样的虚拟表......

WITH CTE

AS

(
    SELECT 3 AS Rating
    UNION SELECT 4
    UNION SELECT 7
)


SELECT AVG(Rating)
FROM 
CTE

我们得到4的整数平均值

但是,如果我们这样做

WITH CTE

AS

(
    SELECT 3.0 AS Rating
    UNION SELECT 4.0
    UNION SELECT 7.0
)


SELECT AVG(Rating)
FROM 
CTE

我们得到的小数平均值为4.666..etc

所以看起来要走的路是

WITH CTE

AS

(
    SELECT 3 AS Rating
    UNION SELECT 4
    UNION SELECT 7
)
SELECT CONVERT(int,ROUND(AVG(CONVERT(decimal,Rating)),0))
FROM CTE

这将返回一个整数值5,这是你正在寻找的。

答案 1 :(得分:7)

如果您在SQL Server中,只需使用round(avg(column * 1.0), 0)

* 1.0的原因是因为sql server在某些情况下使用与计算中使用的值相同的数据类型返回计算。因此,如果计算3,4和4的平均值,结果为3.66 ...,但结果的数据类型为整数,因此sql server将使用* 1.0将3.66 ...截断为3隐式将输入转换为小数。

或者,您可以在平均计算之前转换或转换值,例如cast(column as decimal),而不是使用* 1.0技巧。

如果您的列不是整数列,则可以删除* 1.0

PS:round(avg(column * 1.0), 0)的结果仍然是小数,您可以使用convert(int, round(avg(column * 1.0), 0), 0)显式转换它,或者只是让您使用的任何语言完成工作(这是隐式转换)

答案 2 :(得分:6)

Select cast(AVG(columnname) as integer)

答案 3 :(得分:3)

这样做了:

CONVERT(int,ROUND(AVG(CAST(COLUMN-NAME AS DECIMAL)),0))

是不是有更短的方法呢?

答案 4 :(得分:2)

select cast(avg(a+.5) as int) from 
    (select 1 a union all select 2) b

如果您不喜欢快捷方式,可以使用很长的路:

select round(avg(cast(a as real)), 0) 
    from (select 1 a union all select 2) b

答案 5 :(得分:1)

以下陈述是等效的:

-- the original code
CONVERT(int, ROUND(AVG(CAST(mycolumn AS DECIMAL)) ,0))

-- using '1e0 * column' implicitly converts mycolumn value to float
CONVERT(int, ROUND(AVG(1e0 * mycolumn) ,0))

-- the conversion to INT already rounds the value
CONVERT(INT, AVG(1e0 * mycolumn))

答案 6 :(得分:1)

T-SQL2018。

CAST(ROUND(COLUMN, 0) AS INT)此代码为我完成了工作,并提供了我需要的输出,因此4.8变为5。

CAST(AVG(COLUMN) AS INT)此代码几乎可以完成工作,但四舍五入,因此4.8变为4而不是5。