2013-03-01 13 views
10

Quindi c'è la funzione SQL AVG(), che prende la media di tutti i valori in una colonna, ignorando tutti i valori NULL. Se è necessario calcolare una media ponderata, utilizzare SUM (valore * peso)/SUM (peso) con una clausola Group By.Creazione di una media ponderata - Rilascio di pesi per valori NULL

Se volessi fare il secondo, ma alcuni dei miei valori sono NULL, allora come farei a dire a SQL di ignorare i pesi con osservazioni di valore NULL nella funzione SUM (peso)?

Il mio altro problema è che sto prendendo una media di 90 diverse colonne contemporaneamente, quindi vorrei evitare di fare 90 nuove variabili di peso per questo calcolo.

Fammi sapere se l'ho chiarito o no.

sto usando SQL Server 2005

risposta

20

si usa di somma condizionale come denominatore:

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

Se i pesi sono sempre più grande di 0, allora non dovete preoccuparvi di dividere da 0. Ciò si verifica solo quando tutti i valori sono NULL. E in tal caso il numeratore sarebbe NULL.

Si potrebbe anche frase come:

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

o come:

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

Questo è più prolisso, ma rende molto chiaro che si sta ignorando i valori NULL sia il numeratore che il denominatore .

+1

@Gordon .... non bombarderà se il valore è nullo poiché dividerà per zero? O cosa succede quando il valore è nullo – MikeTWebb

+1

@MikeTWebb. . . NULL in * qualsiasi * operazione diversa da 'IS NULL' e' IS NOT NULL' restituisce NULL. Questo è vero anche per la divisione per 0. Ma, ho incluso la seconda versione nel caso qualcuno potesse pensarci. Sarà più chiaramente restituito NULL se non corrisponde nulla. –

+0

+1 ma 'um' ... Penso che tu intendessi' sum'. :-) –