Obtener AVG ignorando valores Nulos o Cero
¿Cómo puedo obtener el AVG
de una columna ignorando los valores NULL
y cero?
Tengo tres columnas para obtener su promedio, trato de usar el siguiente 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
¡No obtengo ningún resultado, sin embargo las tres columnas tienen valores que incluyen NULL y ceros!
¿Hay alguna forma de excluir los valores nulos antes de obtener la media?
ejemplo: AVERAGE(NOTNULL(SecurityW))
36
3
NULL
ya se ignora, así que puedes usar
NULLIFpara convertir
0en
NULL. Además no necesitas
DISTINCTy tu
WHEREen
ActualTime` no es sargable.PS No tengo ni idea de lo que
Table2 b
está en la consulta original para que no hay ninguna condición de unión para que he omitido de mi respuesta.esto debería funcionar, aunque no lo he probado. esto excluirá cero. NULL se excluye por defecto
Ya se intenta filtrar los valores
NULL
conNOT NULL
. He cambiado esto porIS NOT NULL
en la cláusulaWHERE
para que se ejecute. Podemos refactorizar esto eliminando la funciónISNULL
del métodoAVG
. Además, dudo que realmente necesitesbigint
así que podemos eliminar el cast.