Mysql AVG игнорировать ноль

Мне нужно выполнить среднее значение для столбца, но я знаю, что большинство значений в этом столбце будут равны нулю. Из всех возможных строк только две, вероятно, будут иметь положительные значения. Как я могу указать mySQL игнорировать нули и усреднять только фактические значения?


person Oranges13    schedule 17.03.2011    source источник


Ответы (4)


Предполагая, что вы, возможно, захотите не полностью исключать такие строки (возможно, у них есть значения в других столбцах, которые вы хотите агрегировать)

SELECT AVG(NULLIF(field ,0)) 
from table
person Martin Smith    schedule 17.03.2011
comment
Спасибо, это, вероятно, будет лучшим вариантом, потому что да, у меня есть значения в других столбцах! - person Oranges13; 17.03.2011
comment
это прекрасно работает, особенно когда в вашем запросе есть более 1 агрегатной функции. - person Avishai; 02.01.2013
comment
Спасибо, работает для меня! - person Marco López; 09.12.2020
comment
Спасибо! Я боролся с этим в течение нескольких минут. - person CJL89; 28.05.2021

Вероятно, вы могли бы контролировать это с помощью предложения WHERE:

select avg( field ) from table where field > 0
person Mark Wilkins    schedule 17.03.2011
comment
Только если меня беспокоят строки, в которых поле больше нуля. К сожалению, в этом случае мне нужно проверить еще 3 столбца, где это может быть не так. - person Oranges13; 17.03.2011

Вы можете преобразовать нули в NULL, тогда функция AVG() будет работать только с не NULL значениями.

UPDATE table SET column = NULL WHERE column='0';
SELECT AVG(column) FROM table;
person Barvajz    schedule 16.10.2012
comment
Йиш. Изменить существующие данные, чтобы заставить SELECT работать? Я думаю, меня стошнит... - person Matthew Clark; 23.12.2014

person    schedule
comment
Это работает, за исключением того, что есть другие поля, которые я хочу получить одновременно с одним большим средним значением. - person Oranges13; 17.03.2011