Среднее значение T-SQL округлено до ближайшего целого числа

Я не уверен, было ли это задано раньше, но как получить среднее значение округления до ближайшего целого в T-SQL?

Спасибо

Ответ 1

Это сработало для этого:

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

Есть ли более короткий способ сделать это, хотя?

Ответ 2

Это должно сделать это. Вам может понадобиться GROUP BY на конце в зависимости от того, что вы ищете в среднем.

SELECT CONVERT(int,ROUND(AVG(ColumnName),0))
FROM 
TableName

EDIT: Этот вопрос интереснее, чем я думал.

Если мы создадим фиктивную таблицу, например...

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, которое вы ищете.

Ответ 3

Если вы находитесь в SQL Server, просто используйте round(avg(column * 1.0), 0).

Причина * 1.0 заключается в том, что сервер sql в некоторых случаях возвращает вычисления, используя тот же тип данных значений, используемых в вычислении. Итак, если вы вычисляете среднее значение 3, 4 и 4, результат равен 3,66..., но тип данных результата является целым числом, поэтому sql-сервер будет обрезать 3.66... до 3, используя * 1.0 implicit convert вход в десятичный знак.

В качестве альтернативы вы можете конвертировать или отличать значения до среднего вычисления, например cast(column as decimal) вместо трюка * 1.0.

Если ваш столбец не является целым столбцом, вы можете удалить * 1.0.

PS: результат round(avg(column * 1.0), 0) по-прежнему является десятичным, вы можете явно преобразовать его с помощью convert(int, round(avg(column * 1.0), 0), 0) или просто позволить любому языку, который вы используете, выполнять задание (это неявное преобразование)

Ответ 4

Select cast(AVG(columnname) as integer)

Ответ 5

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

Ответ 6

Следующие утверждения эквивалентны:

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

Ответ 7

Т-SQL2018.

CAST(ROUND(COLUMN, 0) AS INT) Этот код делает работу за меня и выдает вывод, который мне нужен, поэтому 4.8 становится 5.

в то время как

CAST(AVG(COLUMN) AS INT) Этот код почти выполняет работу, но округляется, поэтому 4,8 становится 4, а не 5.

Ответ 8

В SQL 2014,

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