NULL ignoreras redan så du kan använda NULLIF för att vända 0 till NULL . Du behöver inte heller DISTINCT och din WHERE på ActualTime är inte sargbar.
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 Jag har ingen aning om vad Table2 b finns i den ursprungliga frågan eftersom det inte finns något kopplingsvillkor för det så har utelämnat det från mitt svar.