일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- rs485
- sql developer
- Visual Studio Code
- MX Component
- M2M
- scrapy
- oracle
- 크롤링
- 장고
- 티스토리 초대장
- 윈도우10
- MEAN Stack
- 오라클
- 텐서플로우
- PYTHON MSSQL
- rs422
- c#
- 자본주의
- vscode
- Serial
- pymssql
- 파이썬
- windows10
- Python
- MSSQL
- 딥러닝
- matplot
- tensorflow
- MSSQL PYTHON
- django
- Today
- Total
안까먹을라고 쓰는 블로그
[SQL Query] CASE 식 (Feat. 조건분기) 본문
일반적인 절차 지향형 프로그래밍 언어에는 조건 분기를 사용하기 위한 수단으로 if 조건문과 switch 조건문 등이 있습니다. SQL에도 이처럼 조건 분기를 하는 방법이 있으며, 이것이 CASE식 입니다.
■ 기본 구문 형식
CASE WHEN [평가식] THEN [식]
WHEN [평가식] THEN [식]
WHEN [평가식] THEN [식]
생략..
ELSE [식]
END
- WHEN 구의 평가식은 '필드 = 값' 처럼 조건을 지정하는 식을 말합니다.
- 처리되는 순서는 처음에 있는 WHEN 구의 평가식부터 평가되고 조건이 맞으면 THEN 구에 지정된 식이 리턴되며, CASE 식 전체가 종료됩니다. 만약 조건이 맞지 않으면 다음 WHEN 구로 이동해 같은 처리를 반복합니다. 마지막 WHEN 구 까지 반복했는데도 조건이 맞는 경우가 없다면, ELSE 에서 지정한 식이 리턴되며 끝납니다.
- CASE 식의 강력한 점은 식 이라는 것입니다. 따라서 식을 적을 수 있는 곳이라면 어디든지 적을 수 있습니다. - SELECT, WHERE, GROUP BY, HAVONG, ORDER BY 구와 같은 곳 어디에나 적을 수 있으므로 다양한 기법으로 활용할 수 있습니다.
■ 사용 예시 (기본)
SELECT name, address
CASE WHEN address = '하남시' THEN '경기'
WHEN address = '강남구' THEN '서울'
WHEN address = '부산시' THEN '영남'
WHEN address = '속초시' THEN '관동'
WHEN address = '서귀포시' THEN '호남'
ELSE NULL END AS district
FROM address
■ 사용 예시 1
Population (인구 테이블)
prefecture (지역 이름) | sex (성별) | pop (인구) |
성남 | 1 | 60 |
성남 | 2 | 40 |
수원 | 1 | 90 |
수원 | 2 | 100 |
광명 | 1 | 100 |
광명 | 2 | 50 |
일산 | 1 | 100 |
일산 | 2 | 100 |
용인 | 1 | 20 |
용인 | 2 | 200 |
▷ 원하는 결과
prefecture | pop_men | pop_wom |
수원 | 90 | 100 |
일산 | 100 | 100 |
성남 | 60 | 40 |
광명 | 100 | 50 |
용인 | 20 | 200 |
※ pop_men : 남성의 인구, pop_wom : 여성의 인구
▶ UNION 을 사용한 방법
SELECT prefecture, SUM(pop_mem) AS pop_mem, SUM(pop_wom) AS pop_wom
FROM (SELECT prefecture, pop AS pop_men, null AS pop_wom
from Population
WHERE sex = '1' -- 남성
UNION
SELECT prefecture, pop AS pop_men, null AS pop_wom
from Population
WHERE sex = '2' -- 여성
) TMP
GROUP BY prefecture
▶ CASE 식을 사용한 방법
SELECT prefecture,
SUM(CASE WHEN sex = '1' THEN pop ELSE 0 END) AS pop_men, -- 남자
SUM(CASE WHEN sex = '2' THEN pop ELSE 0 END) AS pop_wom -- 여자
FROM Population
GROUP BY prefecture
■ 사용 예시 2
Employees (직원 테이블)
emp_id (직원ID) | team_id (팀 ID) | emp_name (직원 이름) | team (팀) |
201 | 1 | Joe | 상품기획 |
201 | 2 | Joe | 개발 |
201 | 3 | Joe | 영업 |
202 | 2 | Jim | 개발 |
203 | 3 | Carl | 영업 |
204 | 1 | Bree | 상품기획 |
204 | 2 | Bree | 개발 |
204 | 3 | Bree | 영업 |
204 | 4 | Bree | 관리 |
205 | 1 | Kim | 상품기획 |
205 | 2 | Kim | 개발 |
▷ 원하는 결과
emp_name | team |
Jim | 개발 |
Bree | 3개 이상을 겸무 |
Joe | 3개 이상을 겸무 |
Carl | 영업 |
Kim | 2개를 겸무 |
1. 소속된 팀이 1개라면 해당 직원은 팀의 이름을 그대로 출력한다.
2. 소속된 팀이 2개라면 해당 직원은 "2개의 겸무" 라는 문자열을 출력한다.
3. 소속된 팀이 3개라면 해당 직원은 "3개 이상을 겸무" 라는 문자열을 출력한다.
▶ UNION 을 사용한 방법
SELECT emp_name, MAX(team) AS Team
FROM Employees
GROUP BY emp_name
HAVING COUNT(*) = 1
UNION
SELECT emp_name, '2개를 겸무' AS Team
FROM Employees
GROUP BY emp_name
HAVING COUNT(*) = 2
UNION
SELECT emp_name, '3개 이상을 겸무' AS Team
FROM Employees
GROUP BY emp_name
HAVING COUNT(*) >= 3
▶ CASE 식을 사용한 방법
SELECT emp_name,
CASE WHEN COUNT(*) = 1 THEN MAX(team)
WHEN COUNT(*) = 2 THEN '2개를 겸무'
WHEN COUNT(*) >= 3 THEN '3개 이상을 겸무'
END AS team
FROM Employees
GROUP BY emp_name
■ 사용 예시 3
NonAggTbl (비집약 테이블)
id | data_type | data_1 | data_2 | data_3 | data_4 | data_5 | data_6 |
Jim | A | 100 | 10 | ||||
Jim | B | 167 | 77 | 90 | |||
Jim | C | 457 | |||||
Ken | A | 78 | 5 | ||||
Ken | B | 178 | 346 | 85 | |||
Ken | C | 33 | |||||
Beth | A | 75 | 0 | ||||
Beth | B | 183 | 4 | ||||
Beth | C | 12 |
data_type = 'A' 인 경우에는 data_1, data_2
data_type = 'B' 인 경우에는 data_3, data_4, data_5
data_type = 'C' 인 경우에는 data_6
※ 공백으로 표시 된 부분에도 불규칙적인 데이터가 들어있다고 가정한다.
▷ 원하는 결과
id | data_1 | data_2 | data_3 | data_4 | data_5 | data_6 |
Jim | 100 | 10 | 167 | 77 | 90 | 457 |
Ken | 78 | 5 | 178 | 346 | 85 | 33 |
Beth | 75 | 0 | 183 | 4 | 12 |
▶ CASE 식을 사용한 방법
SELECT id,
MAX(CASE WHEN data_type = 'A' THEN data_1 ELSE NULL END) AS data_1,
MAX(CASE WHEN data_type = 'A' THEN data_2 ELSE NULL END) AS data_2,
MAX(CASE WHEN data_type = 'B' THEN data_3 ELSE NULL END) AS data_3,
MAX(CASE WHEN data_type = 'B' THEN data_4 ELSE NULL END) AS data_4,
MAX(CASE WHEN data_type = 'B' THEN data_5 ELSE NULL END) AS data_5,
MAX(CASE WHEN data_type = 'C' THEN data_6 ELSE NULL END) AS data_6
FROM NonAggTbl
GROUP BY id
'DataBase > MS SQL' 카테고리의 다른 글
[MSSQL] 조회 시, ROW <=> COLUMNS 방향 변경 (0) | 2022.04.06 |
---|---|
[MSSQL] 컬럼의 데이터 번호붙여서 업데이트하기 (0) | 2022.02.08 |
[SQL Query] 실행계획 확인방법 (0) | 2021.12.30 |
[SQL Query] CASE 문 (0) | 2021.12.30 |
[SQL Query] MetaData (메타데이터) (0) | 2021.12.30 |