Подтвердить что ты не робот

Получить AVG, игнорируя значения Null или Zero

Как я могу получить AVG столбца, игнорирующего NULL и нулевые значения?

У меня есть три столбца, чтобы получить их среднее значение, я пытаюсь использовать следующий script:

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

Я не получаю никаких результатов, однако три столбца имеют значения, включая NULL и нули!

В любом случае, чтобы исключить нулевые значения до получения среднего значения?

Пример: AVERAGE(NOTNULL(SecurityW))

4b9b3361

Ответ 1

NULL уже игнорируется, поэтому вы можете использовать NULLIF, чтобы превратить 0 в NULL. Также вам не нужно DISTINCT, а ваш WHERE на ActualTime не поддается.

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 Я понятия не имею, что Table2 b находится в исходном запросе, так как для него нет условия соединения, поэтому он опустил его из моего ответа.

Ответ 2

это должно работать, но не пробовал. это исключает ноль. По умолчанию исключается NULL.

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

Ответ 3

работал у меня:

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

Ответ 4

Вы уже пытаетесь отфильтровать значения NULL с помощью NOT NULL. Я изменил это на IS NOT NULL в предложении WHERE, чтобы он выполнялся. Мы можем реорганизовать это, удалив функцию ISNULL в методе AVG. Кроме того, я сомневаюсь, что вам действительно понадобится bigint, чтобы мы могли удалить бросок.

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

Ответ 5

В случае отсутствия "0" или "NULL" в средней функции. Просто используйте

AVG(NULLIF(your_column_name,0))