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

use*_*365 14 sql t-sql sql-server

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

谢谢

Dav*_*ele 18

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

SELECT CONVERT(int,ROUND(AVG(ColumnName),0))
FROM 
TableName
Run Code Online (Sandbox Code Playgroud)

编辑:这个问题比我最初想的更有趣.

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

WITH CTE

AS

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


SELECT AVG(Rating)
FROM 
CTE
Run Code Online (Sandbox Code Playgroud)

我们得到4的整数平均值

但是,如果我们这样做

WITH CTE

AS

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


SELECT AVG(Rating)
FROM 
CTE
Run Code Online (Sandbox Code Playgroud)

我们得到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
Run Code Online (Sandbox Code Playgroud)

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


use*_*271 8

如果您在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)或者只是让您使用的任何语言完成工作(这是一个隐式转换)


小智 7

Select cast(AVG(columnname) as integer)
Run Code Online (Sandbox Code Playgroud)


use*_*365 5

这对它有用:

CONVERT(int,ROUND(AVG(CAST(COLUMN-NAME AS DECIMAL)) ,0))
Run Code Online (Sandbox Code Playgroud)

难道没有更短的方法吗?