Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenez AVG en ignorant les valeurs Null ou Zero

NULL est déjà ignoré, vous pouvez donc utiliser NULLIF pour passer 0 à NULL . De plus, vous n'avez pas besoin de DISTINCT et votre WHERE sur ActualTime n'est pas 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 Je n'ai aucune idée de ce que Table2 b est dans la requête d'origine car il n'y a pas de condition de jointure pour cela, donc je l'ai omis de ma réponse.