AVG и NULL: среднее не по тем
Средняя сумма сделки за месяц — простая сводка для отчёта:
SELECT AVG(amount) AS средний_чек
FROM receipts;Число выходит бодрое. Но если у части строк графа amount не заполнена — призрак вместо цифры, — AVG эти строки не считает ни в числителе, ни в знаменателе. Он вообще делает вид, что их не было.
«AVG не занижает среднее пустыми строками. Он их полностью выкидывает — как будто этих сделок вовсе не случалось.»
По чему именно считается это среднее?
Отсюда и разница между «средний чек по документам» и «средний чек по всем визитам»: они считаются по разным знаменателям, хотя оба зовутся одинаково.
Если пустая графа должна считаться нулём — подставьте ноль сами, до усреднения.
SELECT AVG(COALESCE(amount, 0)) AS средний_чек_с_нулями
FROM receipts;
-- теперь пустые строки участвуют как 0, а не исчезают из счёта«Спросите не „какое среднее“, а „среднее по чему именно“. Ответ на второй вопрос обычно и есть настоящая улика.»
Среднее не по тем — улика тихая и очень обидная. В архиве на ней держится целое дело.