我正在使用SQL Server查找某些列的平均值,但是我想忽略任何值为0或null的列
我正在从中读取表:
我的查询:
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
答案 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