스터디/DB(ORACLE) ORACLE 그룹핑 GROUP BY, HAVING, ROLLUP 고무곰(GomuGom) 2017. 9. 5. 09:09 --Group by 절 -- distinct처럼 중복되지 않도록 나오지만 각 튜플마다 집계함수와 연계되어 -- 각 튜플별로 그룹핑해 그 결과를 알고싶을 때 주로 사용된다. -- 예를들어, 여러 학생들의 성적이 들어 있는 Student테이블이 있을 때 -- A반,B반,C반... 반마다 평균 국어 성적을 구한다고 했을 때 반으로 그룹핑을 하고 avg로 평균을 구할 수 있다. select distinct department_id from EMPLOYEES; select department_id from Employees GROUP BY DEPARTMENT_ID; --부서별 급여 합계 : 그룹별(부서별) 급여 총액 구하기 select DEPARTMENT_ID, sum(SALARY) from Employees GROUP BY DEPARTMENT_ID; --부서별,직급별 사원수와 평균 급여를 구해보자. -- job_id 도 같이 출력할 경우 DEPARTMENT_ID 때문에 일일이 하나하나 다 표시될 수 없기 때문에 -- 이 job_id또한 GROUP BY를 걸어주어야 한다. select DEPARTMENT_ID, job_id, sum(SALARY), count(*), round(avg(salary),2) from Employees GROUP BY DEPARTMENT_ID, job_id; select DEPARTMENT_ID, job_id, sum(SALARY), count(*), round(avg(salary),2) from Employees GROUP BY DEPARTMENT_ID, job_id ORDER BY DEPARTMENT_ID, job_id; select DEPARTMENT_ID, job_id, to_char(sum(salary),'999,999') 총급여, to_char(avg(salary),'999,999') 평균급여 from Employees where department_id = 80 GROUP BY DEPARTMENT_ID,job_id ORDER BY DEPARTMENT_ID, job_id; --having 절 -- GROUP BY의 조건절 --현재 부서별 사원수가 10명 이상인 직원수 구하기 -- 집계 그룹과 관련된 조건(사원수 10명이상)이기 때문에 having절이 필요 -- 집계함수에 대한 조건을 사용할 때(sum,count,avg 등...) having절을 사용하고 -- 부서id가 80이고 null이 아닌...등의 조건은 where절을 사용하면 된다. SELECT department_id 부서ID, count(*) 직원수 FROM Employees where department_id is not null -- null이 아닌 부서 id만 출력할 것(<>사용하면 안됨) GROUP BY department_id HAVING count(*) > 10 ORDER BY department_id; --rollup --[ ROLLUP operator ] -- ROLLUP구문은 GROUP BY 절과 같이 사용 되며, GROUP BY절에 의해서 그룹 지어진 집합 결과에 대해서 좀 더 상세한 정보를 반환하는 기능을 수행 한다. -- SELECT절에 ROLLUP을 사용함으로써 보통의 SELECT된 데이터와 그 데이터의 총계를 구할 수 있다. -- : 그룹별 합계 정보를 추가해서 보여주는 함수 -- Employees 테이블에는 department_id정보에 대한 부서Name 정보가 없는데 -- Employees 테이블에 대해 GROUP BY를 해 출력할 경우 부서 테이블에 있는 부서명도 같이 출력하고 싶을 때 -- rollup 함수를 이용하면 효과적으로 해당정보를 가져올 수 있다.(그룹별에서 조인을 쉽게할 수 있는 함수) select l.CITY, d.DEPARTMENT_NAME, e.JOB_ID, count(*) 사원수, sum(e.salary) 총급여 from Employees e, departments d, locations l where e.DEPARTMENT_ID = d.DEPARTMENT_ID and d.LOCATION_ID = l.LOCATION_ID group by rollup(l.CITY, d.DEPARTMENT_NAME, e.JOB_ID) -- 그룹별 나뉘어진것 결과가 나오고 그 서브 합계도 추가로 출력되게된다.(rollup) order by l.CITY, d.DEPARTMENT_NAME, e.JOB_ID; -- 따라서 rollup을 쓰면 좀 더 세밀한 결과값들을 얻어올 수 있다. 저작자표시 비영리