したがって、SQL関数AVG()があります。これは、すべてのNULL値を無視して、列内のすべての値の平均を取ります。加重平均を作成する必要がある場合は、Group By句を指定してSUM(値*重み)/ SUM(重み)を使用するだけです。
後者を実行したいが、値の一部がNULLである場合、SUM(weight)関数でNULL値の観測値を持つ重みを無視するようにSQLに指示するにはどうすればよいですか?
もう1つの問題は、一度に平均90の異なる列を取得することです。そのため、この計算で90の新しい重み変数を作成することは避けたいと思います。
これを明確にしたかどうか教えてください。
SQL Server2005を使用しています
分母として条件付き合計を使用します。
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値を無視していることを非常に明確にしています。