본문 바로가기
개발 기록/sql

[SQL] NVL, COUNT, SUM

by jeong11 2024. 1. 4.
반응형

1. NVL

: null 값 대신 다른 데이터를 출력하는 명령어

 

1) 사용문법 

nvl (컬럼명, 변경값)

 

2) 문제

> 이름과 커미션을 출력하는데 커미션이 null인 사원은 no comm으로 출력되게 하세요

select ename, nvl(comm, 'no comm') from emp;

내가 처음에 쓴 답 : 에러 ORA-01722: invalid number

select ename, nvl(to_char(comm), 'no comm') from emp;

고친 답 : 정답

처음 쓴 답은 기존의 데이터 comm과 치환할 데이터 'no comm'의 유형이 다르기 때문에 에러가 난다. 

comm을 문자형으로 변환하는 to_char를 사용해준다. 

 

> 모든 사원들에게 커미션을 200씩 추가하여 사원 이름, 커미션 값을 출력하세요. 

select ename, nvl(comm, 0)+200 from emp;

 

> 사원번호, 사원이름, 총 급여를 출력하세요.

select empno, ename, sal+nvl(comm,0) from emp;

 

 

2. COUNT

: 건 갯수 출력하기 

count는 group 함수기 때문에 null 값을 포함하지 않고 계산한다.  

1) 사용문법

count (대상)

 

2) 문제

> 직업과 직업별 인원수를 출력하는데 직업이 SALESMAN인 사람은 제외하고, 직업별 인원수가 3명 이상인 경우만 출력하세요. 

select job, count(*) from emp
	where job!='SALESMAN' 
    	group by job
   	having count(*)>=3;

 

> 부서별 평가등급이 'B등급'인 사람의 수를 출력하세요. 

select count(*) 
from emp e, hr h, dept d
	where e.empno = h.emp.no 
	and d.deptno = e.deptno
	and h.grade = 'B';

 


3. SUM

: 토탈값 출력하기

1) 사용문법

sum(대상) 

 

2) 문제

> 직업과 직업별 토탈 월급을 출력하는데 토탈 월급이 6000 이상인 경우만 출력하세요. 

 

select job, sum(sal) from emp where sum(sal)>=6000 group by job;

내가 처음에 쓴 답 : 에러

 

select job, sum(sal) from emp
	group by job
	having sum(sal)>=6000;

고친 답 : 정답

group 함수로 검색 조건을 줄 때는 where절이 아니라 having을 사용해야 한다.

작성법 : group by 이후 having 절로 조건을 작성해주면 된다. 

 

 

4. sum+decode

: row를 column으로 출력

1) 예제

> 부서번호와 부서번호별 토탈 월급을 출력하는데 가로로 출력하세요. 

 

*기존의 세로 출력*

select deptno, sum(sal) from emp group by deptno;

 

*가로로 출력* 

select sum(decode(deptno, 10, sal, null)) as "10",
	sum(decode(deptno, 20, sal, null)) as "20",
	sum(decode(deptno, 30, sal, null)) as "30"
	from emp;

0이 아니라  null 로 적은 이유 : 그룹함수는 null을 연산에서 제외하기 때문에 연산 효율이 더 좋다. 0을 쓰면 연산에  포함이 된다. 

null은 생략 가능해서 다음과 같이 생략해도 결과는 같다. 

select sum(decode(deptno, 10, sal)) as "10",
	sum(decode(deptno, 20, sal)) as "20",
	sum(decode(deptno, 30, sal)) as "30"
	from emp;

 

참고) 

10번 부서는 급여가 나오고 나머지 부서는 0으로 출력한다. 또 별칭을 숫자로 하는 경우 " "를 붙여줘야 한다. 

select deptno,, decode(deptnno, 10, sal, null) as "10" from emp;

 

 

> 직업, 직업별 토탈 월급을 가로로 출력하세요. 

 

*기존의 세로 출력*

select job, sum(sal) from emp group by job;

 

*가로로 출력*

select sum(decode(job, 'CLERK', sal)) as CLERK,
	sum(decode(job, 'SALESMAN', sal)) as SALESMAN,
	sum(decode(job, 'PRESIDENT', sal)) as PRESIDENT,
	sum(decode(job, 'MANAGER', sal)) as MANAGER,
	sum(decode(job, 'ANALYST')) as ANALYST 
	from emp;

 

반응형