Notice
Recent Posts
Recent Comments
관리 메뉴

안까먹을라고 쓰는 블로그

[SQL Query] CASE 식 (Feat. 조건분기) 본문

DataBase/MS SQL

[SQL Query] CASE 식 (Feat. 조건분기)

YawnsDuzin 2022. 1. 6. 10:01

 

반응형

일반적인 절차 지향형 프로그래밍 언어에는 조건 분기를 사용하기 위한 수단으로 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



 

 

반응형
Comments