2012-03-23 2 views
4

У меня есть таблица, подобное этомуфункция SQL Server AVG возвращать NULL, если все значения NULL

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

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

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

Спасибо,

+1

Какой тип данных является выходом? Как ясно сказано в сообщении об ошибке, его тип данных несовместим с AVG. – Pondlife

+0

Тип данных - float, и в сообщении об ошибке указано, что void (NULL) несовместим. Проблема здесь в том, что AVG (NULL) возвращает ошибку вместо NULL. –

+0

Тогда что-то странно, потому что «void type» в ошибке предполагает, что это не настоящая таблица, а производная таблица. См. Здесь: http://blog.sqlauthority.com/2011/06/27/sql-server-puzzle-involving-null-resolve-error-operand-data-type-void-type-is-invalid-for-sum -оператор/ – Pondlife

ответ

1

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

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

select sum(a) from (select convert(int, null) a union select null) a 
2

Попробуйте использовать СЛУЧАЙ как этот

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 также будет работать

+0

К сожалению, функция SUM ведет себя одинаково, и SUM (NULL) дает ту же ошибку. –

+0

Я также проверил с типом данных float, и приведенный выше запрос работает нормально. Я думаю, проблема связана с именем столбца. Просто измените имя столбца на ExitCol и проверьте. –

0

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

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 
0
Select avg(isnull(Exit,0)) from table 
+0

Этот ответ неправильный, но +1 за попытку помочь – Andomar

Смежные вопросы