47

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

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' 

PSTable2 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 に答える
1

NULLですでに値を除外しようとしていますNOT NULLIS 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
于 2013-07-02T12:02:00.993 に答える