47

如何获得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))

4

6 回答 6

72

NULL已被忽略,因此您可以使用NULLIF转至。你也不需要,你的on也不是 sargable。0NULLDISTINCTWHEREActualTime

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原始查询中的内容是什么,因为它没有连接条件,所以我的回答中省略了它。

于 2013-07-02T12:04:58.043 回答
14

这应该可以,但还没有尝试过。这将排除零。默认排除 NULL

AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
于 2013-07-02T12:02:54.110 回答
9

在平均函数中不考虑“0”或“NULL”的情况下。只需使用

AVG(NULLIF(your_column_name,0))
于 2017-10-26T06:36:37.700 回答
4

为我工作:</p>

AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
于 2016-11-28T08:14:48.850 回答
1

您已经尝试使用 过滤掉NULLNOT NULL。我已将其更改为IS NOT NULLWHERE子句中,因此它将执行。我们可以通过删除方法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
于 2013-07-02T12:02:00.993 回答
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;
于 2021-05-28T16:01:07.393 回答