NULL sudah diabaikan sehingga Anda dapat menggunakan NULLIF untuk mengubah 0 ke NULL . Anda juga tidak perlu DISTINCT dan WHERE . Anda pada ActualTime tidak 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 Saya tidak tahu apa Table2 b ada dalam kueri asli karena tidak ada kondisi bergabung untuk itu, jadi hilangkan dari jawaban saya.