【问题标题】:SQL Server AVG function to return NULL if all values are NULL如果所有值都为 NULL,则 SQL Server AVG 函数返回 NULL
【发布时间】:2012-03-23 12:10:58
【问题描述】:

我有一张类似的桌子

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

当我选择 AVG(Entry) 时,它正确地给了我 32154,当我选择 AVG(Exit) 时,它会爆炸说“操作数数据类型 void 类型对 avg 运算符无效。”

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

谢谢,

【问题讨论】:

  • Exit是什么数据类型?正如错误消息中明确指出的,它的数据类型与 AVG 不兼容。
  • 数据类型为float,错误信息提示void (NULL) 不兼容。这里的问题是 AVG(NULL) 返回错误而不是 NULL。
  • 然后有些奇怪,因为错误中的“void type”表明这不是真正的表,而是派生表。见这里:blog.sqlauthority.com/2011/06/27/…
  • 它改变了行为,因为您的子查询可能正在执行以下操作:SELECT NULL AS Exit没有为该列指定数据类型,这才是真正的问题。应该是这样的:SELECT CAST(NULL AS FLOAT) AS Exit 而不是
  • 我认为你需要强制转换为浮点数,因为所有值都是 null 并且无法推断类型。

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


【解决方案1】:

尝试像这样使用 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) 给出了相同的错误。
  • 我也检查了浮点数据类型,上面的查询工作正常。我认为问题出在列名上。只需将列名更改为 ExitCol 并检查。
【解决方案2】:

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

如果所有值都是 NULL(和正确的数据类型),您可以运行此查询来查看您确实从 SUM 中得到 NULL

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

【讨论】:

    【解决方案3】:
    Select avg(isnull(Exit,0)) from table
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多