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))
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
は、結合条件がないため、元のクエリに含まれているため、私の回答から省略しています。
これは動作するはずですが、試していません。これはゼロを除外します。 NULLはデフォルトで除外されます
AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
平均関数で「0」または「NULL」を考慮しない場合。単に使用する
AVG(NULLIF(your_column_name,0))
私のために働いた:
AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
NOT NULL
でNULL
値を除外しようとしています。 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