Создание взвешенного среднего - снижение веса для значений 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 как в числителе, так и в знаменателе.