본문 바로가기

프로그래밍

SQL sum()함수 사용시 특정 조건에(IF, CASE) 맞는 컬럼만 추출하여 합산하기 with GROUP BY

SQL sum()함수 사용시 특정 조건에(IF, CASE) 맞는 컬럼만 추출하여 합산하기 with GROUP BY


예전에는 생각도 않고 쓰던 일들이 있을지 모른다는 생각에 뒤적이다보면 나오는 신기한 상황을 
하루하루 느끼면서 살고 있습니다.
인터넷에서 낚시를 피해 제대로 된 먹이를 찾기가 쉽지가 않지만 검증이라는 수고를 거치면 되니 시간과의 싸움이라 생각합니다.




아무튼, 오늘은 어찌 sum()함수를 사용하다가 문득 다른 방법이 있을 것 같다라는 생각으로 찾았습니다.

원하는 컬럼과 그리고 원하는 컬럼 중 특정 컬럼을 필터
하는 방법입니다.

제가 알고 있던 sum()이런 식이 었습니다.


이런식의 테이블에서 value컬럼의 합계를 얻으려면
sum(value) 를 select문 안에서 해주는 일이었습니다.

하지만 이번 포스팅 전에 처한 상황은 이렇지 않았죠.


이런식인데 status가 O이고 del_yn이 0인 것들입니다.
del_yn은 이미 WHERE절에서 걸러 내어 문제가 아니지만 sum(value)를 통해서는 원하는 값을 얻어낼 수 없을 것입니다.

이런 상황이 자주 일어나는 것은 아닌 것 같습니다만,
알아둘 필요가 있는 것 같습니다.
sum()을 사용하면서 또 조건을 준다는 것은 이미 GROUP BY가 이뤄진 상태에서의 진행이었습니다.
최신의 어떤 ROW의 결과 중 특정 컬럼의 정보만을 가공하겠다는 의미로 사용하였습니다.
GROUP BY없이 이 일을 진행하였다면 한 개 ROW만 반환되어 TABLE전체에 대한 SUM()이 발생하니까요.

아무튼 사용법은 역시나 간단하였습니다.
하지만 상당히 생소하였습니다..... 처음이라서요.


이런식으로 사용합니다. 
우리가 알고 있는 그 IF와 크게 차이가 없습니다.
이런식으로 하면 GROUP BY한 ROW들에서도 각각 GROUP의 특정 컬럼을 또 필터링하여 값을 얻기 쉽습니다.
특정 컬럼 몇가지에 대해서만 조건이 필요할 때 쓰는것이 물론 더 빠르게 동작하도록 하는 것이죠.

위의 SUM(if( , , ))형태외에 한 가지가 더 있습니다.


CASE, THEN, ELSE, END 입니다. switch~case와 비슷한 구성입니다. 

IF와 CASE는 사실 sum()에서만 쓰이는 것이 아니라 다른 컬럼에 대한 개별적인 조건 부여시에 사용됩니다.

더 많은 곳에서 다양하게 사용할 수 있으니, 
sum()에서만이라는 오해는 없으셨음 좋겠습니다!