T-SQL平均值四舍五入到最接近的整数。

15

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


1
Floor函数总是向下取整。 - David Steele
1
@David,谢谢提示。我没有看到他想要“最接近”的整数,我以为应该向下舍入。我将删除我的评论。 - rabudde
8个回答

18

这应该可以解决问题。根据您要计算的平均值的内容,您可能需要在 End 上加上 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..等等。
因此,看起来最好的方法是:
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,这正是您要寻找的。


你是否用真实的列名和表名替换了它们? - David Steele
谢谢Jon。我必须承认这个结果让我有点惊讶。它很有道理,但不是我预期的。 - David Steele

13
如果你在使用SQL Server,只需使用round(avg(column * 1.0), 0)* 1.0的原因是因为在某些情况下,SQL Server返回的计算结果和用于计算的值使用相同的数据类型。因此,如果计算3、4和4的平均值,结果为3.66...,但结果的数据类型是整数,因此SQL Server将3.66...截断为3,使用* 1.0 将输入隐式转换为十进制。
或者,您可以在进行平均值计算之前转换或转换值,例如使用cast(column as decimal)而不是使用* 1.0 技巧。
如果您的列不是整数列,则可以删除* 1.0
PS:round(avg(column * 1.0), 0)的结果仍然是十进制数,您可以使用convert(int, round(avg(column * 1.0), 0), 0) 显式将其转换或让您正在使用的任何语言来完成这项工作(它是一个隐式转换)。

8
Select cast(AVG(columnname) as integer)

6
这对IT技术来说是有效的:
CONVERT(int,ROUND(AVG(CAST(COLUMN-NAME AS DECIMAL)) ,0))

有没有更简单的方法来完成呢?

你要计算平均值的列的名称和数据类型是什么? - David Steele
数据类型为整数 - 名称为评分。 - user441365
1
看起来你最内层的十进制转换确实有所不同。你可以使用CAST或CONVERT,但为了整洁起见,我不会混用它们。 - David Steele

4

T-SQL2018。

CAST(ROUND(COLUMN, 0) AS INT) 这段代码可以满足我的需求,将4.8变成5。

然而

CAST(AVG(COLUMN) AS INT) 这段代码几乎可以达到我的要求,但是它会向下取整,因此4.8变为4而不是5。


迄今为止最好、最简单的答案。在我看来。 - FirstFraktal
这对某些情况不起作用,例如: select .9 as val into #x; select cast(round(val, 0) as int) from #x -- error - 8forty

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

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))

1
CONVERT(INT, AVG(1e0 * mycolumn)) 对我很有用,简单地将其转换为整数值! - Ram

-2

在SQL 2014上,

select round(94,-1)
select round(95,-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接