코딩짜는 일상

[MySQL] Error Code: 1111, Error Code: 1064 - SUM IF 를 이용한 조건을 만족하는 값들의 합 구하기 본문

IT/MySQL

[MySQL] Error Code: 1111, Error Code: 1064 - SUM IF 를 이용한 조건을 만족하는 값들의 합 구하기

Remily 2023. 6. 9. 12:45
반응형

서론

업소별 매출자료를 조회하다가 Error Code: 1111Error 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 ('완료', '취소')
...(이하 조건 생략)...

결과는 성공~!





깨달은 점

 

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