NULL já está ignorado, então você pode usar NULLIF para virar 0 para NULL . Além disso, você não precisa de DISTINCT e seu WHERE em ActualTime não é sargável. 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 Não tenho ideia do que
Table2 b está na consulta original, pois não há condição de junção para ela, então a omiti da minha resposta.