-- GROUP BY절과 HAVING절
-- GROUP BY : 테이블의 행들을 원하는 그룹으로 나누기
-- 부서별 그룹의 합계
select deptno, sum(sal) from emp group by deptno;
-- 담당업무별 급여의 합계와 평균 구하기
select job 담당업무, sum(sal) 급여합, ceil(avg(sal)) 급여평균 from emp group by job order by job;
-- 부서별 급여의 합계와 평균, 보너스의 합계와 평균을 구하되 81년도에 입사한 사원만으로 통계를 구하라
select deptno 부서, sum(sal) 급여합계, ceil(avg(sal)) 급여평균, sum(nvl(comm, 0)) 보너스합계, ceil(avg(nvl(comm, 0))) 보너스평균 from emp where hiredate like '81%' group by deptno;
-- ROLLUP : GROUP BY절에 의해서 그룹 지어진 집합결과에 대해서 좀 더 상세한 정보를 반환
-- 담당업무별 급여의 합계를 구하라. 담당업무를 오름차순으로 정렬하라
select job, sum(sal) from emp group by rollup(job) order by job;
-- 1차 분류 부서코드(deptno), 2차 분류 담당업무(job)로 급여의 합계와 평균을 출력
select deptno, job, sum(sal), avg(sal) from emp group by deptno, job order by deptno;
select deptno, job, sum(sal), avg(sal) from emp group by rollup(deptno, job) order by deptno;
select deptno, job, sum(sal), ceil(avg(sal)) from emp group by cube(deptno, job) order by deptno;
select deptno, job from emp order by deptno asc, job asc;
-- JOIN
-- 참고용 : 추후 진행
-- 사원명, 부서코드, 부서명, 부서위치 선택
select ename, emp.deptno, dname, loc from emp, dept where emp.deptno=dept.deptno;
select emp.ename, emp.deptno, dept.dname, dept.loc from emp, dept where emp.deptno=dept.deptno;
select e.ename, e.deptno, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno;
select ename, e.deptno, dname, loc from emp e, dept d where e.deptno=d.deptno;
-- GROUP BY HAVING : 그룹함수의 통계 결과를 이용하여 조건설정
-- 담당업무별 급여의 합계를 구하여, 합계가 5,000불 이상인 담당업무만 출력하라
select job 담당업무, sum(sal) 급여합계 from emp group by job having sum(sal)>5000;
-- 부서코드별 사원수를 구하여 사원수가 4명 이상인 부서만 출력하라.
select * from emp;
select deptno 부서코드, count(*) 사원수 from emp group by deptno having count(*)>=4;
-- 입사년도별 급여의 합계와 사원수를 구하고, 사원수가 5명 미만인 입사년도를 출력하되 담당업무가 PRESIDENT는 제외하라
select to_char(hiredate, 'yyyy') 입사년도, sum(sal) 급여합계, count(*) 사원수 from emp where job!='PRESIDENT' group by to_char(hiredate, 'yyyy') having count(*)<5;