NULL je již ignorováno, takže můžete použít NULLIF pro otočení 0 na NULL . Také nepotřebujete DISTINCT a vaše WHERE v ActualTime není možné protahovat.
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 Nemám ponětí, co Table2 b je v původním dotazu pro, protože pro něj není žádná podmínka spojení, takže jsem ho z mé odpovědi vynechal.