Создание взвешенного среднего - снижение веса для значений NULL
Итак, есть функция SQL AVG(), которая принимает среднее значение всех значений в столбце, игнорируя все значения NULL. Если нужно сделать средневзвешенное значение, тогда они просто используют SUM (значение * вес)/SUM (вес) с предложением Group By.
Если бы я хотел сделать последнее, но некоторые из моих значений NULL, то как я могу сказать, что SQL игнорирует веса с наблюдениями NULL в функции SUM (вес)?
Моя другая проблема заключается в том, что я беру в среднем 90 разных столбцов одновременно, поэтому я бы хотел избежать 90 новых весовых переменных для этого расчета.
Сообщите мне, ясно ли я это или нет.
Я использую SQL Server 2005
Ответы
Ответ 1
Вы использовали бы условное суммирование как знаменатель:
select sum(value*weight) / sum(case when value is not null then weight else 0 end)
Если весы всегда больше 0, вам не нужно беспокоиться о делении на 0. Это произойдет только тогда, когда все значения будут NULL. И в этом случае числитель будет NULL.
Вы также можете разделить его как:
select sum(value*weight) / sum(case when value is not null then weight end)
или как:
select sum(case when value is not null then value*weight end) / sum(case when value is not null then weight end)
Это более подробно, но очень ясно, что вы игнорируете значения NULL как в числителе, так и в знаменателе.