Среднее значение T-SQL округляется до ближайшего целого числа - PullRequest
12 голосов
/ 15 августа 2011

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

Спасибо

Ответы [ 8 ]

17 голосов
/ 15 августа 2011

Это должно сделать это.Возможно, вам понадобится 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, которое вы ищете.

8 голосов
/ 04 мая 2012

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

. Причина для * 1.0 заключается в том, что сервер sql в некоторых случаях возвращает вычисления, используя тот же тип данных, что и значения, используемые в вычислениях.Таким образом, если вы вычислите среднее значение 3, 4 и 4, результат будет 3,66 ..., но тип данных результата будет целочисленным, поэтому сервер SQL будет урезать 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 голосов
/ 15 августа 2011
Select cast(AVG(columnname) as integer)
4 голосов
/ 15 августа 2011

Это сработало:

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

Разве нет более короткого способа сделать это?

2 голосов
/ 15 августа 2011
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 голос
/ 23 февраля 2019

T-SQL2018.

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

, тогда как

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

1 голос
/ 04 мая 2012

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

-- 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))
0 голосов
/ 08 мая 2017

В SQL 2014,

select round(94,-1)
select round(95,-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...