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.