NULL est déjà ignoré, vous pouvez donc utiliser NULLIF pour passer 0 à NULL . De plus, vous n'avez pas besoin de DISTINCT et votre WHERE sur ActualTime n'est pas 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 Je n'ai aucune idée de ce que Table2 b est dans la requête d'origine car il n'y a pas de condition de jointure pour cela, donc je l'ai omis de ma réponse.