다음과 같은 자료가 있다고 하자. 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
;
결과는 다음과 같다.
'MySQL' 카테고리의 다른 글
[MySQL] 데이터 삭제하기 DELETE, TRUNCATE (1) | 2017.12.27 |
---|---|
[MySQL] 테이블에 데이터 입력하기 INSERT INTO (0) | 2017.12.10 |
[MySQL] 테이블 이름 확인하기 SHOW TABLES (0) | 2017.12.08 |
[MySQL] DB에서 특정 행들만 가져오기(1) - WHERE 절의 "or"를 이용 (0) | 2017.09.08 |
[MySQL] 결과 테이블의 일부 조건만 출력하기 HAVING (0) | 2017.08.04 |
[MySQL] apmsetup으로 연습환경 구축하기, 데이터 넣기 Import (0) | 2017.07.25 |
[MySQL] 다른 테이블에서 데이터 참조하기 JOIN (vlookup) (2) | 2017.06.15 |
[MySQL] 합 구하기 sum / 그룹별로 집계하기 group by / 정렬 order by (1) | 2017.05.05 |
[MySQL] 조건절 WHERE 사용하기(and, or, not, like) (0) | 2017.05.04 |
[MySQL] 개수 세기 count / 이름 지정하기 as (0) | 2017.05.03 |
댓글