본문 바로가기
MySQL

[MySQL] 일부 값만 음수로 계산하기 (조건문 CASE)

by LightBlogger 2017. 7. 28.

다음과 같은 자료가 있다고 하자. cointable.csv



위와 같이 엉망인 자료는 드물겠지만, 어쨌든 flag=1 은 코인 충전, flag=2는 코인 사용이라고 생각해 보자.


이때 각 유저별로 갖고 있는 코인의 총량을 알고 싶다면?


flag=1 인 경우는 coin을 더하고 flag=2인 경우는 coin을 빼야 할 것이다. 


엑셀에서는 IF를 쓰면 되겠고, 이런 경우 SQL에서는 CASE를 쓴다.


SELECT 


CASE 

WHEN flag=1 THEN coin

WHEN flag=2 THEN coin * -1

ELSE NULL

END


FROM cointable;


위 쿼리를 실행시키면 다음과 같은 결과를 볼 수 있다.



CASE문 전체가 하나의 열을 만드는 것을 알 수 있다. 


다시 쿼리를 보자.


SELECT 


CASE 

WHEN flag=1 THEN coin

WHEN flag=2 THEN coin * -1

ELSE NULL

END


FROM cointable;


개행은 편의상 한 것이며 꼭 개행할 필요는 없다.


기본적으로 CASE와 END가 처음과 끝에 쓰이며, 괄호는 필요하지 않다.


(마지막에 END를 적지 않아 에러가 나는 경우가 많으므로 주의한다.)



WHEN 다음 조건이 오고, THEN 다음 값이 온다.


첫 조건이 TRUE일 경우 THEN 뒤의 값을 반환하고,


첫 조건이 FALSE일 경우 그 다음 조건으로 넘어가 끝까지 같은 행동을 반복한다.



위 쿼리는 어떤 행의 flag가 1이면 coin 값을 반환하고, flag가 2이면 coin에 (-1)을 곱한 값을 반환하여


하나의 열을 만들라는 의미다.



마지막에 ELSE NULL은 모든 조건이 아닐 경우 NULL값을 반환하라는 명령이다.


생략하면 자동으로 ELSE NULL로 생각하나, 쓰면 쿼리가 좀 더 명확해 보이는 효과가 있다.



사실 위 쿼리는 구조를 보여주기 위해 다소 비효율적으로 적었다. 실제로는 다음과 같이 적는 편이 좋을 것이다.


SELECT 


CASE 

WHEN flag=1 THEN coin

ELSE coin * -1

END

AS sumcoin


FROM cointable;


컬럼명을 sumcoin으로 지정해 주었다.


이제 다음과 같이 case를 sum 안에 넣어 유저별로 그룹핑해 주면 유저별 잔여 코인량을 알 수 있겠다.


SELECT user, sum(


CASE 

WHEN flag=1 THEN coin

ELSE coin * -1

END

)

AS sumcoin


FROM cointable


GROUP BY user

ORDER BY sumcoin desc

;


결과는 다음과 같다.





반응형

댓글