2013-03-01 60 views
10

所以有SQL函數AVG(),它取一列中所有值的平均值,忽略所有NULL值。如果需要進行加權平均,那麼他們只需使用SUM(值*權重)/ SUM(權重)和Group By子句。創建加權平均值 - 爲NULL值丟棄權重

如果我想要做後者,但我的一些值爲NULL,那麼我該如何去告訴SQL忽略SUM(weight)函數中NULL值觀察值的權重?

我的另一個問題是,我一次取90個不同列的平均值,所以我想避免爲此計算製作90個新的權重變量。

讓我知道,如果我已經說清楚與否。

我使用SQL Server 2005

回答

20

你會使用條件求和作爲分母:

select sum(value*weight)/sum(case when value is not null then weight else 0 end) 

如果權重總是大於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值。

+1

@戈登....如果價值爲零,那麼它會不會是炸彈,因爲它會被零除?或者當值爲空時會發生什麼 – MikeTWebb 2013-03-01 18:48:55

+1

@MikeTWebb。 。 。除了'IS NULL'和'IS NOT NULL'以外的任何*操作中的NULL都返回NULL。對於除以0,情況甚至是這樣。但是,如果有人可能會考慮這個問題,我會列入第二個版本。如果沒有任何匹配,它將更清楚地返回NULL。 – 2013-03-01 18:52:21

+0

+1但是'um' ...我想你的意思是'sum'。 :-) – 2013-03-01 19:05:08