How can I get the AVG
of a column ignoring NULL
and zero values?
I have three columns to get their average, I try to use the following script:
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
I don't get any results, however the three columns have values including NULL and zeros!
Is there anyway to exclude null values before getting the average?
example: AVERAGE(NOTNULL(SecurityW))
AVG() function does not consider the NULL values during its calculation.
To exclude entries with “0”, you need to use NULLIF() with function AVG().
By default, the AVG function uses ALL clause whether you specify it or not. It means the AVG function will take all non-NULL values when it calculates the average value.
PostgreSQL AVG() function and NULL Third, use the AVG() function to calculate average values in the amount column. It returns 20, meaning that the AVG() function ignores NULL values.
NULL
is already ignored so you can use NULLIF
to turn 0
to NULL
. Also you don't need DISTINCT
and your WHERE
on ActualTime
is not 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 I have no idea what Table2 b
is in the original query for as there is no join condition for it so have omitted it from my answer.
this should work, haven't tried though. this will exclude zero. NULL is excluded by default
AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With