如何让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))
答案 0 :(得分:57)
NULL
已被忽略,因此您可以使用NULLIF
将0
转为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;