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))
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.
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)
Bei Nichtberücksichtigung von '0' oder 'NULL' in der Durchschnittsfunktion. Einfach benutzen
AVG(NULLIF(your_column_name,0))
arbeitete für mich:
AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
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