我不确定之前是否曾经问过这个问题,但是如何将平均值四舍五入到T-SQL中最接近的整数?
由于
答案 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,这是你正在寻找的。 p>
答案 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。