Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obter AVG ignorando valores nulos ou zero


NULL já está ignorado, então você pode usar NULLIF para virar 0 para NULL . Além disso, você não precisa de DISTINCT e seu WHERE em ActualTime não é sargável.
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 Não tenho ideia do que Table2 b está na consulta original, pois não há condição de junção para ela, então a omiti da minha resposta.