Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich AVG, wobei Null- oder Nullwerte ignoriert werden

NULL wird bereits ignoriert, sodass Sie NULLIF verwenden können um 0 zu drehen auf NULL . Außerdem brauchen Sie DISTINCT nicht und Ihr WHERE auf ActualTime ist nicht sargfähig.

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 Ich habe keine Ahnung, was Table2 b ist ist in der ursprünglichen Abfrage für, da es keine Join-Bedingung dafür gibt, also habe ich sie aus meiner Antwort weggelassen.