web-dev-qa-db-ja.com

加重平均の作成-NULL値の重みの削除

したがって、SQL関数AVG()があります。これは、すべてのNULL値を無視して、列内のすべての値の平均を取ります。加重平均を作成する必要がある場合は、Group By句を指定してSUM(値*重み)/ SUM(重み)を使用するだけです。

後者を実行したいが、値の一部がNULLである場合、SUM(weight)関数でNULL値の観測値を持つ重みを無視するようにSQLに指示するにはどうすればよいですか?

もう1つの問題は、一度に平均90の異なる列を取得することです。そのため、この計算で90の新しい重み変数を作成することは避けたいと思います。

これを明確にしたかどうか教えてください。

SQL Server2005を使用しています

12
Jared

分母として条件付き合計を使用します。

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値を無視していることを非常に明確にしています。

25
Gordon Linoff