2014-10-19 2 views
2

6549 행이있는 테이블 #time_per_bike가 있습니다 (중복 된 것이 없으며 bikeid 열에도 고유 한 ID가 있음). SQL 서버에서 SUM()/총 행과 AVG() 사이에 다른 결과가 반환되었습니다.

Sample Data

아무도 말해 줄 수

왜 내가 (. 나는 그들이 동일한 작업을 할 생각하기 때문에 만약 내가 잘못 제발 올바른) 두 개의 쿼리 사이에 다른 결과를 얻고있다 - 샘플을 참조하십시오?

select SUM(AVG_WAIT_TIME)/6549 from #time_per_bike 
-- Returns 69499 

select AVG(AVG_WAIT_TIME) from #time_per_bike 
-- Returns 69520 

답변

6

가 "NULL 값이 계산 최종 결과에 포함되지 않도록 COUNT (*) 함수를 제외한 모든 집계 기능은 널 제거 단계를 수행한다." 참조 : http://en.wikipedia.org/wiki/Null_(SQL)

따라서 NULL 개의 데이터가 있습니다.

데이터에서 널 (null)을 처리하는 방법에 따라 두 가지 선택 사항이 있습니다. 0 값으로 처리하거나 행을 완전히 제거하여 COUNT (*)에 기여하지 않도록 할 수 있습니다 (AVG()처럼). 참조 위키 페이지에서

:

예를 들어, 다음 표에서 AVG (I) (값 I의 의 평균) AVG (j)과는 다른 결과를 제공한다 :

Table 
i   j 
150  150 
200  200 
250  250 
NULL  0 

여기 AVG (ⅰ) AVG (j)가 150 동안, 200 (150, 200, 및 250의 평균)이다 ((250) (150)의 평균, 200, 0). 이러한

잘 알려진 부작용 SQL AVG (Z)는 SUM (z)/COUNT (*)

+0

와 일치하지 않는, 오른쪽에 @Mitch 점이다. AVG_WAIT_TIME에 NULLS가 있습니다. 따라서이 경우 올바른 평균값은 무엇입니까? 나는 AVG()를 가진 하나를 추측한다. –

+2

글쎄, 그것은 당신이 당신의 데이터에서 널을 어떻게 다루고 싶어하는지에 달려있다. 0 값으로 처리하거나 행을 완전히 삭제할 수 있습니다 (따라서 COUNT (*)에 기여하지 않음) –

+0

감사합니다.이 두 null을 0으로 업데이트하고 평균값을 사용하는 것이 좋습니다. –

관련 문제