NULL jest już ignorowany, więc możesz użyć NULLIF aby zmienić 0 na NULL . Również nie potrzebujesz DISTINCT i Twój WHERE w ActualTime nie jest 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 Nie mam pojęcia co Table2 b jest w pierwotnym zapytaniu, ponieważ nie ma warunku dołączenia do niego, więc pominąłem go w mojej odpowiedzi.