2013-03-01 7 views
10

Es gibt also die SQL-Funktion AVG(), die den Durchschnitt aller Werte in einer Spalte annimmt, wobei alle NULL-Werte ignoriert werden. Wenn man einen gewichteten Durchschnitt machen muss, dann würde man einfach SUM (Wert * Gewicht)/SUM (Gewicht) mit einer Group By-Klausel verwenden.Erstellen eines gewichteten Durchschnittswerts - Löschen von Gewichtungen für NULL-Werte

Wenn ich letzteres machen möchte, aber einige meiner Werte NULL sind, wie würde ich SQL dann dazu bringen, Gewichtungen mit NULL-Wert-Beobachtungen in der SUM (Gewicht) -Funktion zu ignorieren?

Mein anderes Problem ist, dass ich im Durchschnitt 90 verschiedene Spalten auf einmal nehme, also möchte ich vermeiden, 90 neue Gewichtsvariablen für diese Berechnung zu machen.

Lassen Sie mich wissen, ob ich dies klargestellt habe oder nicht.

Ich bin mit SQL Server 2005

Antwort

20

Sie bedingte Summierung als Nenner verwenden würde:

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

Wenn die Gewichte immer größer als 0 ist, dann müssen Sie sich nicht um divide Sorge um 0. Das würde nur auftreten, wenn alle Werte NULL sind. Und in diesem Fall wäre der Zähler NULL.

Sie könnten auch Ausdruck als:

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

oder als:

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

Dies ist ausführlicher, aber macht es sehr klar, dass Sie NULL-Werte sowohl im Zähler und Nenner ignorieren .

+1

@Gordon .... wird nicht diese Bombe, wenn Wert Null ist, da es dann durch Null dividieren? Oder was passiert, wenn der Wert null ist – MikeTWebb

+1

@MikeTWebb. . . NULL in * any * -Operationen außer 'IS NULL' und' IS NOT NULL' gibt NULL zurück. Das ist sogar richtig, um durch 0 zu teilen. Aber ich habe die zweite Version eingeschlossen, falls jemand darüber nachdenken sollte. Es wird deutlicher NULL zurückgeben, wenn nichts passt. –

+0

+1 aber 'um' ... Ich denke du meintest' sum'. :-) –