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

4

我有一个类似于这个的表格

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

当我选择AVG(Entry)时,它正确地显示32154;当我选择AVG(Exit)时,则会出现“操作数数据类型无效”的错误提示。
如何让只有NULL值的列显示NULL的平均值?
谢谢。

1
Exit是什么数据类型?正如错误信息明确指出的那样,它的数据类型与AVG不兼容。 - Pondlife
数据类型是浮点型,错误信息显示空值(NULL)不兼容。问题在于AVG(NULL)返回的是错误而不是NULL。 - Tamas Pataky
这是一个子查询的结果集,但这如何改变AVG函数的行为? - Tamas Pataky
2
它会改变行为,因为您的子查询可能正在执行以下操作:SELECT NULL AS Exit,而没有为该列指定数据类型,这是真正的问题。应该像这样:SELECT CAST(NULL AS FLOAT) AS Exit - Lamak
2
我认为你需要将其转换为浮点数,因为所有的值都是 null,类型无法推断。 - Nikola Markovinović
显示剩余2条评论
4个回答

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 也会起作用。


不幸的是,SUM函数的行为也相同,SUM(NULL)会产生相同的错误。 - Tamas Pataky
我也检查了浮点数据类型,上述查询正常工作。我认为问题出在列名上。只需将列名更改为ExitCol并检查即可。 - Ravindra Gullapalli

1
问题在于“退出”列没有与SUM函数兼容的数据类型。
您可以运行此查询以查看如果所有值都为NULL(并且具有适当的数据类型),则确实从SUM获取NULL。
select sum(a) from (select convert(int, null) a union select null) a

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接