我不确定之前是否有人问过这个问题,但我该如何在T-SQL中将平均值四舍五入到最接近的整数?
我不确定之前是否有人问过这个问题,但我该如何在T-SQL中将平均值四舍五入到最接近的整数?
这应该可以解决问题。根据您要计算的平均值的内容,您可能需要在 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,这正是您要寻找的。
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
。round(avg(column * 1.0), 0)
的结果仍然是十进制数,您可以使用convert(int, round(avg(column * 1.0), 0), 0)
显式将其转换或让您正在使用的任何语言来完成这项工作(它是一个隐式转换)。Select cast(AVG(columnname) as integer)
CONVERT(int,ROUND(AVG(CAST(COLUMN-NAME AS DECIMAL)) ,0))
T-SQL2018。
CAST(ROUND(COLUMN, 0) AS INT)
这段代码可以满足我的需求,将4.8变成5。
然而
CAST(AVG(COLUMN) AS INT)
这段代码几乎可以达到我的要求,但是它会向下取整,因此4.8变为4而不是5。
select .9 as val into #x;
select cast(round(val, 0) as int) from #x -- error
- 8fortyselect 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
-- 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))
在SQL 2014上,
select round(94,-1)
select round(95,-1)