13

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

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

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

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

SQLServer2005を使用しています

4

1 に答える 1

30

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

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

于 2013-03-01T18:46:38.217 に答える