NULL er allerede ignoreret, så du kan bruge NULLIF for at slå 0 til NULL . Du behøver heller ikke DISTINCT og din WHERE på ActualTime er ikke sargerbar.
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 Jeg aner ikke hvad Table2 b er i den oprindelige forespørgsel, da der ikke er nogen join-betingelse for det, så har udeladt det fra mit svar.