获取AVG忽略Null或Zero值

时间:2013-07-02 11:57:32

标签: sql sql-server tsql sql-server-2008-r2

如何让AVG列忽略NULL且零值?

我有三列来获得他们的平均值,我尝试使用以下脚本:

SELECT distinct
     AVG(cast(ISNULL(a.SecurityW,0) as bigint)) as Average1
     ,AVG(cast(ISNULL(a.TransferW,0) as bigint)) as Average2
     ,AVG(cast(ISNULL(a.StaffW,0) as bigint)) as Average3
FROM Table1 a,  Table2 b
WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL
AND a.TransferW<> 0 AND a.TransferWIS NOT NULL
AND a.StaffW<> 0 AND a.StaffWIS NOT NULL
AND MONTH(a.ActualTime) = 4
AND YEAR(a.ActualTime) = 2013

我没有得到任何结果,但是这三列的值包括NULL和零!

无论如何在获得平均值之前排除空值?

示例:AVERAGE(NOTNULL(SecurityW))

6 个答案:

答案 0 :(得分:57)

NULL已被忽略,因此您可以使用NULLIF0转为NULL。此外,您不需要DISTINCT,而WHERE上的ActualTime也不会受到攻击。

SELECT AVG(cast(NULLIF(a.SecurityW, 0) AS BIGINT)) AS Average1,
       AVG(cast(NULLIF(a.TransferW, 0) AS BIGINT)) AS Average2,
       AVG(cast(NULLIF(a.StaffW, 0) AS BIGINT))    AS Average3
FROM   Table1 a
WHERE  a.ActualTime >= '20130401'
       AND a.ActualTime < '20130501' 

PS我不知道原始查询中的Table2 b是什么,因为没有连接条件,所以从我的答案中省略了它。

答案 1 :(得分:12)

这应该工作,但没试过。这将排除零。默认情况下排除NULL

AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)

答案 2 :(得分:4)

如果不考虑&#39; 0&#39;或者&#39; NULL&#39;平均功能。 只需使用

AVG(NULLIF(your_column_name,0))

答案 3 :(得分:3)

为我工作:

AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)

答案 4 :(得分:1)

您已尝试使用NULL过滤掉NOT NULL值。我在IS NOT NULL子句中将其更改为WHERE,因此它将执行。我们可以通过删除ISNULL方法中的AVG函数来重构此操作。另外,我怀疑你实际上需要bigint所以我们可以移除演员。

SELECT distinct
     AVG(a.SecurityW) as Average1
     ,AVG(a.TransferW) as Average2
     ,AVG(a.StaffW) as Average3
FROM Table1 a,  Table2 b
WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL
AND a.TransferW<> 0 AND a.TransferWIS IS NOT NULL
AND a.StaffW<> 0 AND a.StaffWIS IS NOT NULL
AND MONTH(a.ActualTime) = 4
AND YEAR(a.ActualTime) = 2013

答案 5 :(得分:0)

空值无论如何都被排除在平均计算之外。如果您还需要排除零值,您可以简单地在 avg 函数中使用 decode 函数:-

SELECT AVG(decode(a.SecurityW,0,null,a.SecurityW)) as Average1
 ,AVG(decode(a.TransferW,0,null,a.TransferW)) as Average2
 ,AVG(decode(a.StaffW,0,null,a.StaffW)) as Average3 
FROM Table1 a,  Table2 b
WHERE MONTH(a.ActualTime) = 4
AND YEAR(a.ActualTime) = 2013;