Функция SQL Server AVG для возврата NULL, если все значения NULL - PullRequest
4 голосов
/ 23 марта 2012

У меня есть таблица, похожая на эту

+--+-----+----+
|ID|Entry|Exit|
+--+-----+----+
|18|32154|NULL|
+--+-----+----+
|19|NULL |NULL|
+--+-----+----+

Когда я выбираю AVG (Entry), он правильно дает мне 32154, когда я выбираю AVG (Exit), он взрывается, говоря «Тип данных операнда типа voidнедопустимо для оператора avg. "

Как получить значение NULL в качестве среднего для столбца, который имеет только значения NULL?

Спасибо,

Ответы [ 4 ]

2 голосов
/ 23 марта 2012

Попробуйте использовать CASE следующим образом

SELECT CASE WHEN SUM(Exit) IS NULL THEN NULL ELSE AVG(Exit) END AS MyAverage 
FROM MyTable

Я думаю, что проблема с именем столбца.Просто измените имя столбца на ExitCol и проверьте.

В этом случае даже SELECT AVG(ExitCol) AS MyAverage FROM MyTable также будет работать

1 голос
/ 23 марта 2012

Проблема в том, что столбец Exit не имеет типа данных, совместимого с функцией SUM.

Вы можете запустить этот запрос, чтобы увидеть, что вы действительно получаете NULL из SUM, если все значения NULL (и правильный тип данных)

select sum(a) from (select convert(int, null) a union select null) a
0 голосов
/ 23 марта 2012
Select avg(isnull(Exit,0)) from table
0 голосов
/ 23 марта 2012

используйте set xact_abort off, чтобы вернуть null

  declare @a table (id int, amount numeric(10,2))
  insert into @a values (1, null), (2,null), (3,null) 

  set xact_abort off

  select AVG(amount)
  from @a
...