Я не уверен, было ли это задано раньше, но как получить среднее значение округления до ближайшего целого в T-SQL?
Спасибо
Я не уверен, было ли это задано раньше, но как получить среднее значение округления до ближайшего целого в T-SQL?
Спасибо
Это сработало для этого:
CONVERT(int,ROUND(AVG(CAST(COLUMN-NAME AS DECIMAL)) ,0))
Есть ли более короткий способ сделать это, хотя?
Это должно сделать это. Вам может понадобиться 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, которое вы ищете.
Если вы находитесь в 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)
или просто позволить любому языку, который вы используете, выполнять задание (это неявное преобразование)
Select cast(AVG(columnname) as integer)
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
Следующие утверждения эквивалентны:
-- 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))
Т-SQL2018.
CAST(ROUND(COLUMN, 0) AS INT)
Этот код делает работу за меня и выдает вывод, который мне нужен, поэтому 4.8 становится 5.
в то время как
CAST(AVG(COLUMN) AS INT)
Этот код почти выполняет работу, но округляется, поэтому 4,8 становится 4, а не 5.
В SQL 2014,
select round(94,-1)
select round(95,-1)