web-dev-qa-db-ja.com

Get AVG NullまたはZero値を無視

AVG値とゼロ値を無視して、列のNULLを取得するにはどうすればよいですか?

平均を取得するために3つの列があります。次のスクリプトを使用してみます。

_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
_

結果は得られませんが、3つの列にはNULLとゼロを含む値があります!

とにかく、平均値を取得する前にnull値を除外する方法はありますか?

例:AVERAGE(NOTNULL(SecurityW))

35
SVI

NULLはすでに無視されているため、NULLIFを使用して0からNULLへ。また、DISTINCTは不要であり、WHERE上のActualTimeはsargableではありません。

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は、結合条件がないため、元のクエリに含まれているため、私の回答から省略しています。

59
Martin Smith

これは動作するはずですが、試していません。これはゼロを除外します。 NULLはデフォルトで除外されます

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

平均関数で「0」または「NULL」を考慮しない場合。単に使用する

AVG(NULLIF(your_column_name,0))
4
Irfan

私のために働いた:

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

NOT NULLNULL値を除外しようとしています。 WHERE句でこれをIS NOT NULLに変更して、実行できるようにしました。 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
1
Darren