데이터베이스(DB) - CASE WHEN(예제, 문제풀이)
CASE WHEN은 조건에 따라 값을 주는건데 자바에서 if ,else if, else라고 생각하시면 편해요
●기본 문법
CASE 컬럼
WHEN 조건1 THEN 값1
WHEN 조건2 THEN 값2
ELSE 값3
END
(컬럼이 조건1 일때는 값1을, 조건2 일때는 값2를 반환하고 조건에 맞지 않는 경우에는 값3을 반환하는 것입니다)
●앞에서 포스팅했지만 emp테이블 다시 한번 보여드릴게요
●예제
문제 1. DEPTNO컬럼의 10,20,30을 10번부서,20번부서,30번부서로 각각 바꾸고 이름과 바꾼부서 이름을 보이시오
SELECT ename 이름,
CASE WHEN DEPTNO = 10 THEN '10번 부서'
WHEN DEPTNO = 20 THEN '20번 부서'
WHEN DEPTNO = 30 THEN '30번 부서'
END 부서이름
FROM emp;
●이제부터는 앞에 포스팅 했던 NVL과 조인을 합쳐서 한번 해볼게요
●먼저 조인할 dept 테이블입니다.
※dept테이블에는 40부서가 있지만 emp테이블에는 10 20 30만 있습니다.
●예제
문제 1. DEPTNO컬럼의 10,20,30,40을 10번부서,20번부서,30번부서,40번부서로 각각 바꾸고
40번 부서에는 사람이 없으니 '사람없음'을 넣고
사원번호(deptno)와 이름과 부서명을 보이시오 (제가 막 만들고 있는거라서 예제가 이상해요...)
SELECT A.DEPTNO, NVL(B.ename ,'사람없음') 이름 ,
CASE WHEN A.DEPTNO = 10 THEN '10번 부서'
WHEN A.DEPTNO = 20 THEN '20번 부서'
WHEN A.DEPTNO = 30 THEN '30번 부서'
WHEN A.DEPTNO = 40 THEN '40번 부서'
END DEPTNO
FROM dept A LEFT OUTER JOIN emp B
ON A.deptno = B.deptno;
/*외부조인을 해서 부서이름들을 바꾸고 NVL을 이용해서 비어있는곳은 사람없음으로 넣었어요*/
●문제 1번을 조금 더 심화해서 해볼까요
문제 2. DEPTNO컬럼의 10,20,30,40을 10번부서,20번부서,30번부서,40번부서로 각각 바꾸고 부서별로 합계와 평균을 나타내시오.
SELECT CASE WHEN dept.deptno = 10 THEN '10번 부서 '
WHEN dept.deptno = 20 THEN '20번 부서 '
WHEN dept.deptno = 30 THEN '30번 부서 '
WHEN dept.deptno = 40 THEN '40번 부서 '
END deptno,
SUM(SAL+NVL(COMM,0)) 합계 ,ROUND(AVG(SAL+NVL(COMM, 0)),2) 평균
FROM dept LEFT OUTER JOIN emp
ON emp.deptno = dept.deptno
GROUP BY dept.deptno
ORDER BY dept.deptno;
/*ROUND는 소수점을 자르는거에요 2번째자리 까지 잘랐어요
복잡해보이지만 앞 포스팅에서 하나씩 상세히 해드렸으니 천천히 해석해보세요*/