如果所有值都为NULL,则SQL Server AVG函数返回NULL

时间:2012-03-23 12:10:59

标签: sql sql-server sql-server-2008 null average

我有一张类似于此的表

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

当我选择AVG(Entry)时它正确地给了我32154,当我选择AVG(退出)时它会爆炸说"操作数数据类型void类型对于avg操作符无效。"

如何将NULL作为仅具有NULL值的列的平均值?

谢谢,

4 个答案:

答案 0 :(得分:2)

尝试像这样使用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 :(得分:1)

问题是Exit列没有与SUM函数兼容的数据类型。

如果所有值都为NULL(以及正确的数据类型),您可以运行此查询以确定您确实从SUM中获取了NULL

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

答案 2 :(得分:0)

使用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

答案 3 :(得分:0)

Select avg(isnull(Exit,0)) from table