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원)
'SQL > MYSQL' 카테고리의 다른 글
Mysql MariaDB Encoding 문제 해결 (0) | 2016.10.11 |
---|---|
MySQL이 지원하는 컬럼타입 (0) | 2015.03.18 |
MySQL 쓰면서 하지 말아야 할 것 17가지 (0) | 2015.03.18 |
CUBRID vs MySQL vs ORACLE SQL 타입별 비교 (0) | 2015.03.17 |
ORACLE -> MYSQL 대체 함수 (0) | 2015.03.16 |
MS-SQL BULK INSERT시 데이터 형식 (0) | 2014.06.11 |
[MS-SQL 2008 PROCEDURE] 컬럼명을 조회하여 쿼리문을 만들고 실행하기 (0) | 2014.06.11 |
[MS-SQL 2008 PROCEDURE] 임시 테이블에 값을 저장하여 UPDATE후 임시 테이블 내용을 조회하여 RETURN (0) | 2014.06.11 |