2014-11-21 2 views
0

3 열의 평균 수를 계산하려고하지만 column이 null이 아니고 0보다 큰 경우에만 계산에 열을 포함합니다.3 열의 평균 수 계산

예를 들어 평균은 일반적으로

(column1 + column2 + column3)/3 

하지만 3 열이 null 또는 0이라면 그것은

(column1 + column2 + column3)/2 or (column1 + column2)/2 

내가 여기까지 졸을 가지고 있지만이 완료되지 않은 것입니다. 열 중 하나가 0 일 때 평균이 잘못됨 (0이 기본값 임)

SELECT movie.title, 
movie.imdbrating, 
movie.metacritic, 
tomato.rating, 
((imdbrating + metacritic + tomato.rating)/3) as average 
FROM movie, tomato 
WHERE movie.imdbid = tomato.imdbid 

어떻게 구현할 수 있습니까?

+0

'AVG' 네이티브 함수를 사용해 보셨습니까? 어쩌면 NULL 값을 무시합니다. – Asenar

+0

@Asenar 어떻게 도움이 될 수 있습니까? – Strawberry

답변

2

나는 테이블 별칭과 적절한 join 구문을 사용하는 쿼리의 나머지 부분을 고정하고있다. 그러나 case 문은 당신이 정말로 필요하다 :

SELECT m.title, m.imdbrating, m.metacritic, 
     t.rating, 
     ((case when imdbrating > 0 then imdbrating else 0 end) + 
     (case when metacritic > 0 then metacritic else 0 end) + 
     (case when t.rating > 0 then t.rating else 0 end) + 
     )/nullif(coalesce((imdbrating > 0), 0) + coalesce((metacritic > 0), 0) + coalesce((t.rating > 0), 0)), 0) 
FROM movie m JOIN 
    tomato t 
    ON m.imdbid = t.imdbid; 

분모는 논리 값이 숫자 맥락에서 0 또는 1로 취급됩니다 편리한 MySQL의 확장 기능을 사용하고 있습니다. nullif()은 조건이 부합하지 않는 경우 NULL을 반환합니다. 그리고 NULL 값의 경우 > 0이 참이 아닙니다.

+0

음수 값은 어떨까요? –

+0

질문이 이해가 가지 않습니다. 이들은 OP가 요구하고있는 평균에 포함되어 있지 않습니다. 그래도'> 0 '이 주어지면 꽤 명확 해 보입니다. –

+0

내 마지막 코멘트를 무시하십시오. – code511788465541441

-1

이 시도 :

SELECT (IF Column3 IS NULL OR Column3=0, AVG(Column1+Column2), Avg(Column1+Column2+ Column3)) as Result FROM Table 

편집 : 트리 열 중 하나가 nullm 할 수있는 경우

,이 시도 :

SELECT AVG(IF(Column1 IS NULL,0,Column1)+IF(Column2 IS NULL,0,Column2)+IF(Column3 IS NULL,0,Column3)) as Result FROM Table 
+0

column1이 null 또는 column2 또는 둘 다인 경우는? 또는 모든 열이 null입니까? – code511788465541441

+0

그는 Column3을 nulleable로만 언급합니다. – ericpap

-1

UPDATE

(ifnull(column1,0)+ifnull(column2,0)+ifnull(column3,0))/ 
nullif((abs(sign(ifnull(column1,0))) 
     +abs(sign(ifnull(column2,0))) 
     +abs(sign(ifnull(column3,0)))), 0) 

음수 값을 처리 할 수 ​​있습니다.

Demo to test