sql >> Base de Datos >  >> RDS >> Sqlserver

Obtener AVG ignorando valores nulos o cero

NULL ya se ignora, por lo que puede usar NULLIF convertir 0 a NULL . Además, no necesita DISTINCT y tu WHERE en ActualTime no es 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' 

PD:no tengo idea de qué Table2 b está en la consulta original porque no hay una condición de unión para ello, así que lo omití de mi respuesta.