728x90
반응형

DROP TABLE IF EXISTS voting;
CREATE TABLE voting(
name VARCHAR(20) , -- 이름
s1 INT , -- 국어
s2 INT , -- 영어
s3 INT -- 수학
);
INSERT INTO voting VALUES ('이효리',1,2,NULL), ('성유리',3,NULL,4), ('옥주현',3,1,2);

# 이름 합계 평균
# 이효리 3 1.5
# 성유리 7 3.5
# 옥주현 6 2.0

이효리와 성유리는 중간에 NULL값이 있으므로 평균 계산시 각각 2로 나눠야 합니다.
제일 이쁜 옥주현은 3으로 나누면 됩니다. ^^;;

★ 주의사항
mysql> SELECT (1+2+NULL);
-> NULL

신나게 계산하다가 NULL을 만나면 도루 NULL이 됩니다.
엑셀은 안그런데 SQL은 그렇습니다.

따라서 NULL일때 0으로 치환해야 합니다.
오라클의 경우라면 NVL을 쓸 수 있습니다. 여기에 해당하는 MySQL명령어가
뭘까 알아보니까 COALESCE() 함수가 있더군요.

mysql> SELECT COALESCE(NULL,'널에요');
-> 널에요

그러니까 평균을 구하려면 아래와 같은 쿼리를 날려야 합니다.

SELECT name,
#합계
( COALESCE(s1,0) + COALESCE(s2,0) + COALESCE(s2,0) )
/
#평균
(3 - (COALESCE(s1-s1,1)+COALESCE(s2-s2,1)+COALESCE(s3-s3,1))) AS row_avg
FROM voting

그런데 곰곰히 생각하니까 IFNULL 이더군요. ㅡㅡ;;

SELECT
(IFNULL(s1,0)+IFNULL(s2,0)+IFNULL(s3,0)) /
(3-IFNULL(s1-s1,1)-IFNULL(s2-s2,1)-IFNULL(s3-s3,1)) As row_avg
FROM voting

결과는 물론 같습니다. ^^;;

저번달에 야근에 쫓기다 보니까 IFNUL이 생각이 안나서 구글링하다가
그렇게 되었습니다만, IFNULL 대신에  COALESCE이라는 이름으로 쓸 수도
있다는것을 처음 알았습니다. (소장가치 0.1원)

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,