cannonvirus 2019. 4. 18. 15:38


※ EMP 테이블 구조


※ 그룹 함수

그룹함수 avg, count, max, min, stddev, sum, variance

 

1. max 함수

 # 문제 65. 부서번호가 20번인 사원들 중에서 최대월급을 출력하시오.

 

select deptno, max(sal)

  from emp

  where deptno = 20

  group by deptno;

 

2. avg 함수

 # 문제 66. 커미션이 없는 사원은 0으로 처리하고 평균을 구하시오.

 

select avg(comm)

  from emp;

 

select avg(nvl(comm,0))

  from emp;

 - 첫번째 쿼리는 null값을 무시하기 때문에 나누는 값이 4이고 두번째 쿼리는 null값을 처리했기 때문에 나누는 값이 12이다.

 # 문제 67. 직업 평균 월급이 3000 이상인 것만 출력하시오. (having)

 

select job, avg(sal)

  from emp

  group by job

  having avg(sal) >= 3000;

 

3. count 함수

 # 문제 68. 직업이 SALESMAN인 사원들의 인원수를 출력하시오.

 

select count(*)

  from emp

  where job = 'SALESMAN';

 # 문제 69. 직업, 직업별 인원수를 출력하시오.

 

select job, count(*)

  from emp

  group by job;

 # 문제 70. emp 테이블의 직업의 종류 갯수를 출력하시오.

 

select count(distinct job)

  from emp;

 # 문제 71. 이름, 직업, 자기가 속한 직업의 인원 수를 출력하시오.

select ename, job, count(*) over (partition by job) 인원

  from emp;

 

4. sum 함수

 # 문제 72. 부서번호, 부서번호별 총 월급을 출력하시오.

 

select deptno, sum(sal)

  from emp

  group by deptno;

 

- 세로형식을 가로 형식으로 전환 ~ pivot도 가능

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;

 # 문제 73. 입사한 년도, 입사한 년도별 인원수를 가로로 출력하시오. 

 

select sum(decode(to_char(hiredate,'RRRR'),'1980',1,null)) as "1980",
    sum(decode(to_char(hiredate,'RRRR'),'1981',1,null)) as "1981",
    sum(decode(to_char(hiredate,'RRRR'),'1982',1,null)) as "1982",
    sum(decode(to_char(hiredate,'RRRR'),'1983',1,null)) as "1983"
  from emp;

 

select *
 from (select to_char(hiredate,'RRRR') as nn from emp)
 pivot(count(*) for nn in ('1980','1981','1982','1983'));