2013-03-01 4 views
10

SQL 함수 AVG()는 모든 NULL 값을 무시하고 열의 모든 값의 평균을 취합니다. 가중 평균을해야하는 경우 Group By 절에 SUM (value * weight)/SUM (weight)을 사용하면됩니다.가중 평균 생성 - NULL 값에 대한 가중치 감소

후자를 원하지만 내 값 중 일부가 NULL 인 경우 SUM (체중) 함수에서 NULL 값 관측치가있는 가중치를 무시하도록 SQL을 호출하는 방법은 무엇입니까?

다른 문제는 평균 90 개의 다른 열을 한꺼번에 가져 오는 것입니다. 따라서이 계산에 90 개의 새 가중치 변수를 사용하지 않는 것이 좋습니다.

내가 이것을 분명하게했는지 알려주세요. 나는 당신이 분모로 조건 합산을 사용 SQL 서버 2005

답변

20

을 사용하고

: 가중치가 0보다 항상 더 큰 경우

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

, 당신은 분할에 대해 걱정할 필요가 없습니다 이는 모든 값이 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

@Gordon .... 값이 0 인 경우 0으로 나누면 해당 폭탄을 사용하지 않겠습니까? 또는 값이 null 일 때 어떻게됩니까 – MikeTWebb

+1

@MikeTWebb. . . * IS NULL과 IS NOT NULL을 제외한 * 연산에서 NULL은 NULL을 반환한다. 0으로 나눈 경우에도 마찬가지입니다.하지만 누군가가 그것에 대해 생각할 수도 있기 때문에 두 번째 버전을 포함 시켰습니다. 일치하는 것이 없으면 NULL을 더 명확하게 반환합니다. –

+0

+1하지만 "음"... 나는 당신이 '합계'를 의미한다고 생각합니다. :-) –