使用多个case语句时如何忽略聚合函数(AVG)中的空值

时间:2019-02-13 16:40:29

标签: sql sql-server case average

我正在使用SQL Server查找某些列的平均值,但是我想忽略任何值为0或null的列

我正在从中读取表:

here

我的查询:

macOS_SDK_headers_for_macOS_10.14.pkg

在AVG()函数中使用多个case表达式时,该列始终返回NULL。我在做什么错了?

更新: 正如@Gordon Linoff指出的-这是加法的问题,而不是聚合函数。谁能建议另一种方法来达到我想要的结果?

更新: 我想要的结果:

SELECT AVG(CASE WHEN [January-Margin] > 0 THEN [January-Margin] ELSE NULL END + CASE WHEN [February-Margin] > 0 THEN [February-Margin] ELSE NULL END) as [Margin-Average] FROM MyTable

3 个答案:

答案 0 :(得分:2)

您应该排除where子句中的值。任何具有null的操作都将返回null。

(1 + null) = null;
(1 - null) = null;
(3 + 4 + 5 + null) / 4 = null; // that's AVG function, right there

我发现你的桌子有些奇怪。但是无论如何,您都可以进行嵌套选择。

    select 
(select avg(january-margin) from table where isnull(january-margin,0) > 0) january-margin,
(select avg(february-margin) from table where isnull(february-margin,0) > 0) february-margin
from table

以此类推。

请注意,您可能希望加入外部查询表。

答案 1 :(得分:1)

嗯,我想您可能需要用0代替。问题是加法运算,而不是平均值:

AVG(CASE WHEN [January-Margin] > 0 THEN [January-Margin] ELSE 0 END +
    CASE WHEN [February-Margin] > 0 THEN [February-Margin] ELSE 0 END
   ) as [Margin-Average]

如果所有内容均为0,请使用NULLIF()忽略那些行:

AVG(NULLIF(CASE WHEN [January-Margin] > 0 THEN [January-Margin] ELSE 0 END +
           CASE WHEN [February-Margin] > 0 THEN [February-Margin] ELSE 0 END, 0
          )
   ) as [Margin-Average]

但是,您的问题中没有这样的例子。

编辑:

您只是想要这个吗?

(AVG(NULLIF([January-Margin], 0) + AVG(NULLIF([February-Margin], 0))) / 2

这有点像两列中的值的平均值,其中值不是0

实际平均值为:

(SUM(NULLIF([January-Margin], 0) + SUM(NULLIF([February-Margin], 0))) / (COUNT(NULLIF([January-Margin], 0)) + COUNT(NULLIF([February-Margin], 0)))

答案 2 :(得分:1)

使用CROSS APPLY和NullIf()怎么样

示例

Declare @YourTable Table ([January-Margin] money,[February-Margin] money,[March-Margin] money)  Insert Into @YourTable Values 
 (43.111,0,0)
,(57.289700,0,0)
,(55.535200,56.898700,0)

Select A.* 
      ,B.*
 From @YourTable A
 Cross Apply ( 
               Select AvgMargin = avg(Value)
                From (  values (NullIf([January-Margin] ,0))
                              ,(NullIf([February-Margin],0))
                              ,(NullIf([March-Margin]   ,0))
                      ) B1(value)
            )B

返回

January-Margin  February-Margin March-Margin    AvgMargin
43.111          0.00            0.00            43.111
57.2897         0.00            0.00            57.2897
55.5352         56.8987         0.00            56.2169