NULL è già ignorato quindi puoi usare NULLIF per trasformare 0 a NULL . Inoltre non hai bisogno di DISTINCT e il tuo WHERE su ActualTime non è selezionabile.
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 Non ho idea di cosa Table2 b è nella query originale poiché non esiste una condizione di unione, quindi l'ho omesso dalla mia risposta.