SQL Server AVG函数,用于在所有值均为NULL时返回NULL

SQL Server AVG函数,用于在所有值均为NULL时返回NULL,sql,sql-server,sql-server-2008,null,average,Sql,Sql Server,Sql Server 2008,Null,Average,我有一张类似的桌子 +--+-----+----+ |ID|Entry|Exit| +--+-----+----+ |18|32154|NULL| +--+-----+----+ |19|NULL |NULL| +--+-----+----+ 当我选择AVG(Entry)时,它正确地给出了32154,当我选择AVG(Exit)时,它会弹出“操作数数据类型void type对于AVG运算符无效” 如何将NULL作为只有NULL值的列的平均值 谢谢,试试这样的用例 SELECT CASE WHEN

我有一张类似的桌子

+--+-----+----+
|ID|Entry|Exit|
+--+-----+----+
|18|32154|NULL|
+--+-----+----+
|19|NULL |NULL|
+--+-----+----+
当我选择AVG(Entry)时,它正确地给出了32154,当我选择AVG(Exit)时,它会弹出“操作数数据类型void type对于AVG运算符无效”

如何将NULL作为只有NULL值的列的平均值


谢谢,

试试这样的用例

SELECT CASE WHEN SUM(Exit) IS NULL THEN NULL ELSE AVG(Exit) END AS MyAverage 
FROM MyTable
我认为问题在于列名。只需将列名更改为ExitCol并进行检查


在这种情况下,即使从MyTable中选择AVG(ExitCol)作为MyAverage也会起作用

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

如果所有值都为NULL(并且是正确的数据类型),则可以运行此查询以查看SUM是否确实为NULL


使用
将xact\u 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

退出的数据类型是什么?正如错误消息明确指出的,它的数据类型与AVG不兼容。数据类型是float,错误消息说void(NULL)不兼容。这里的问题是AVG(NULL)返回的是一个错误而不是NULL。然后有些奇怪,因为错误中的“void type”表明这不是一个实表,而是一个派生表。请参见此处:它更改了行为,因为您的子查询可能正在执行以下操作:
选择NULL作为退出
,而不指定该列的数据类型,这才是真正的问题。它应该是这样的:
选择CAST(NULL作为FLOAT)作为Exit
instead我认为您需要将CAST转换为FLOAT,因为所有的值都为NULL,并且无法推断类型。不幸的是SUM函数的行为方式相同,SUM(NULL)给出了相同的错误。我也使用FLOAT数据类型进行了检查,上面的查询工作正常。我认为问题在于列名。只需将列名更改为ExitCol并进行检查。
  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
Select avg(isnull(Exit,0)) from table