[MySQL] Error Code: 1111, Error Code: 1064 - SUM IF 를 이용한 조건을 만족하는 값들의 합 구하기
서론
업소별 매출자료를 조회하다가 Error Code: 1111
와 Error Code: 1064
에러를 봤습니다.
원하는 건
배달완료 건수, 배달취소 건수, 배달완료 할인금액(포인트 + 쿠폰), 배달완료 매출금액
이렇게 4개였는데 WHERE
절에 배달완료인 상태, 배달취소인 상태를 각각 조건 바꿔서 검색하는게 귀찮았습니다.
그래서 WHERE '배달상태' IN ('완료', '취소')
를 조건으로 두고 SUM
, IF
를 이용해 조건 합을 구하려 했지만...
배달완료 할인금액(포인트 + 쿠폰)
에서 오류가 발생하였습니다.
Error Code: 1111
가장 먼저
조건이 맞으면 SUM
을 이용해 포인트와 쿠폰값을 더하도록 해봤습니다.
SELECT SUM( IF(`배달상태`='완료', sum(`포인트` + `쿠폰`), 0) ) AS 할인금액
WHERE `배달상태` IN ('완료', '취소')
...(이하 조건 생략)...
결과
Error Code: 1111. Invalid use of group function
응답을 받았는데, 이는 GROUP
함수를 잘못썼을 때 나타난다고 합니다.
GROUP BY
는 쓴 적 없으니 아니고...
그 외 관련 함수로는 COUNT
, SUM
이 있는데
이 경우엔 SUM
이 문제였습니다.
엑셀에서 A와 B의 합을 구하기위해 SUM
을 쓰는 것과 다르게
MySQL에선 조회하여 나오는 모든 rows를 그룹으로 묶었을 때 하나의 칼럼의 값들을 전부 더한 값을 구해줍니다.
즉, sum(포인트 + 쿠폰)
을 할 때 같이 그룹으로 묶이는 rows가 없어서
또는 그룹이 불분명해서 오류가 난 것이라 볼 수 있겠죠.
Error Code: 1064
그래서 SUM
을 빼고 (포인트 + 쿠폰)
만 해봤지만
SELECT SUM( IF(`배달상태`='완료', (`포인트` + `쿠폰`), 0) ) AS 할인금액
WHERE `배달상태` IN ('완료', '취소')
...(이하 조건 생략)...
Error Code: 1064. You have an error in your SQL syntax
응답을 받았습니다.
여기서 드는 의심은 IF
를 수행할 때
내부에서 간단한 사칙연산까지는 수행할 수 없는게 아닐까 였습니다.
최종 해결
최종적으로 포인트와 쿠폰을 각각 SUM
, IF
하고 그 합을 사칙연산으로 구했습니다.
SELECT SUM( IF(`배달상태`='완료', `포인트`, 0) ) + SUM( IF(`상태`='완료', `쿠폰`, 0) ) AS 할인금액
WHERE `배달상태` IN ('완료', '취소')
...(이하 조건 생략)...
결과는 성공~!

깨달은 점
- SUM은 같은 row의 다른 칼럼들 끼리 합을 구하는데 쓰지 않는다.
- IF는 조건이 맞을 때 또는 틀릴 때 반환하는 값에서 간단한 사칙연산을 추가로 수행하지 못한다.