web-dev-qa-db-de.com

Erhalte AVG ignoriert Null oder Null Werte

Wie kann ich den AVG einer Spalte erhalten, die NULL und Nullwerte ignoriert?

Ich habe drei Spalten, um ihren Durchschnitt zu ermitteln. Ich versuche, das folgende Skript zu verwenden:

SELECT distinct
     AVG(cast(ISNULL(a.SecurityW,0) as bigint)) as Average1
     ,AVG(cast(ISNULL(a.TransferW,0) as bigint)) as Average2
     ,AVG(cast(ISNULL(a.StaffW,0) as bigint)) as Average3
FROM Table1 a,  Table2 b
WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL
AND a.TransferW<> 0 AND a.TransferWIS NOT NULL
AND a.StaffW<> 0 AND a.StaffWIS NOT NULL
AND MONTH(a.ActualTime) = 4
AND YEAR(a.ActualTime) = 2013

Ich erhalte keine Ergebnisse, aber die drei Spalten haben Werte einschließlich NULL und Nullen!

Gibt es eine Möglichkeit, Nullwerte auszuschließen, bevor der Durchschnitt ermittelt wird?

beispiel: AVERAGE(NOTNULL(SecurityW))

35
SVI

NULL wird bereits ignoriert, sodass Sie NULLIF verwenden können, um 0 bis NULL. Sie brauchen auch nicht DISTINCT und Ihr WHERE auf ActualTime ist nicht 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 Ich habe keine Ahnung, was Table2 b ist in der ursprünglichen Abfrage für, da es keine Verknüpfungsbedingung dafür gibt, haben Sie es aus meiner Antwort weggelassen.

59
Martin Smith

das sollte funktionieren, habe es aber nicht versucht. dies schließt null aus. NULL ist standardmäßig ausgeschlossen

AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
12
chetan

Bei Nichtberücksichtigung von '0' oder 'NULL' in der Durchschnittsfunktion. Einfach benutzen

AVG(NULLIF(your_column_name,0))
4
Irfan

arbeitete für mich:

AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
3
Emmerich Liang

Sie versuchen bereits, NULL Werte mit NOT NULL Herauszufiltern. Ich habe dies in der WHERE -Klausel in IS NOT NULL Geändert, damit es ausgeführt wird. Wir können dies umgestalten, indem wir die Funktion ISNULL in der Methode AVG entfernen. Ich bezweifle auch, dass Sie tatsächlich bigint benötigen, damit wir die Besetzung entfernen können.

SELECT distinct
     AVG(a.SecurityW) as Average1
     ,AVG(a.TransferW) as Average2
     ,AVG(a.StaffW) as Average3
FROM Table1 a,  Table2 b
WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL
AND a.TransferW<> 0 AND a.TransferWIS IS NOT NULL
AND a.StaffW<> 0 AND a.StaffWIS IS NOT NULL
AND MONTH(a.ActualTime) = 4
AND YEAR(a.ActualTime) = 2013
1
Darren