Функция SQL Server AVG для возврата NULL, если все значения равны NULL

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

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

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

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

Спасибо,


person Tamas Pataky    schedule 23.03.2012    source источник
comment
Какой тип данных Exit? Как ясно сказано в сообщении об ошибке, его тип данных несовместим с AVG.   -  person Pondlife    schedule 23.03.2012
comment
Тип данных — float, и в сообщении об ошибке говорится, что void (NULL) несовместим. Проблема здесь в том, что AVG(NULL) возвращает ошибку вместо NULL.   -  person Tamas Pataky    schedule 23.03.2012
comment
Тогда что-то странное, потому что тип void в ошибке говорит о том, что это не настоящая таблица, а производная таблица. См. здесь: blog.sqlauthority.com/2011/06/27/   -  person Pondlife    schedule 23.03.2012
comment
Как сказал @Pondlife, это действительно физическая таблица? Или результат другого запроса?   -  person Lamak    schedule 23.03.2012
comment
Это набор результатов подзапроса, но как это меняет поведение функции AVG?   -  person Tamas Pataky    schedule 23.03.2012
comment
Это меняет поведение, потому что ваш подзапрос, вероятно, делает что-то вроде этого: SELECT NULL AS Exit, без указания типа данных для этого столбца, это настоящая проблема. Должно быть так: SELECT CAST(NULL AS FLOAT) AS Exit вместо   -  person Lamak    schedule 23.03.2012
comment
Я думаю, вам нужно привести к плаванию, поскольку все значения равны нулю, и тип не может быть выведен.   -  person Nikola Markovinović    schedule 23.03.2012


Ответы (3)


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

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

select sum(a) from (select convert(int, null) a union select null) a
person Derek Kromm    schedule 23.03.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 тоже будет работать

person Ravindra Gullapalli    schedule 23.03.2012
comment
к сожалению, функция SUM ведет себя так же, и SUM(NULL) выдает ту же ошибку. - person Tamas Pataky; 23.03.2012
comment
Я также проверил с типом данных float, и приведенный выше запрос работает нормально. Я думаю, что проблема с именем столбца. Просто измените имя столбца на ExitCol и проверьте. - person Ravindra Gullapalli; 23.03.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
person Filip De Vos    schedule 23.03.2012