2013-03-01 13 views
10

Istnieje funkcja SQL AVG(), która pobiera średnią wszystkich wartości z kolumny, ignorując wszystkie wartości NULL. Jeśli trzeba zrobić średnią ważoną, to po prostu użyjemy SUM (value * weight)/SUM (weight) z klauzulą ​​Group By.Tworzenie średniej ważonej - Masy upuszczania dla wartości NULL

Jeśli chciałbym zrobić to drugie, ale niektóre z moich wartości są NULL, to w jaki sposób chciałbym powiedzieć SQL ignorować wagi z wartościami NULL obserwacji w funkcji SUMA (waga)?

Moim drugim problemem jest to, że biorę średnio 90 różnych kolumn naraz, więc chciałbym uniknąć tworzenia 90 nowych zmiennych wagi dla tego obliczenia.

Daj mi znać, jeśli jasno to wyjaśniłam.

Używam SQL Server 2005

Odpowiedz

20

byłoby użyć sumowanie warunkowe jako mianownik:

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

Jeżeli wagi są zawsze większe niż 0, to nie trzeba się martwić o przepaści o 0. Taka sytuacja wystąpiłaby tylko wtedy, gdy wszystkie wartości są równe NULL. W takim przypadku licznik będzie NULL.

Można też wyrażenie go jako:

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

lub jak:

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

Jest to bardziej rozwlekły, ale sprawia, że ​​bardzo jasne, że ignorują wartości NULL zarówno w liczniku i mianowniku .

+1

@Gordon .... czy to nie bomba, jeśli wartość jest zerowa, ponieważ zostanie ona podzielona przez zero? Lub co się dzieje, gdy wartość jest zerowa – MikeTWebb

+1

@MikeTWebb. . . NULL w * dowolnej * operacji innej niż 'IS NULL' i' IS NOT NULL' zwraca NULL. Jest tak nawet w przypadku dzielenia przez 0. Ale włączyłem drugą wersję na wypadek, gdyby ktoś o tym myślał. Bardziej wyraźnie zwróci wartość NULL, jeśli nic nie pasuje. –

+0

+1 ale 'um' ... Myślę, że chodziło o' sumę'. :-) –

Powiązane problemy