본문 바로가기

DB/오라클

GROUP BY의 HAVING 절

GROUP BY 

 -  특정한 컬럼의 테이터 들을 다른 데이터들과 비교해 유일한 값에 따라 무리를 짓습니다.

 - GROUP BY절을 사용하여 한 테이블의 행들을 원하는 그룹으로 나눕니다.

 - Column명을 GROUP함수와 SELECT절에 사용하고자 하는 경우 GROUP BY뒤에 Column명을 
   추가 합니다.  


SQL>SELECT b.deptno, COUNT(a.empno)
       FROM emp a, dept b
       WHERE a.deptno = b.deptno
       GROUP BY
b.deptno

DEPTNO   COUNT(*)
-------      ----------
     10          3
     20          5
     30          6

부서별로 그룹을 지은 검색 결과 값이며
부서별로 사원수를 보여줍니다. .

 

☞ Group By 예제

scott/tiger유저로 접속해서 실행하세요..

예제1) 부서별로 그룹하여  부서번호, 인원수, 급여의 평균, 급여의 합을 구하여 출력 하여라.
 
SQL>SELECT deptno,COUNT(*),ROUND(AVG(sal)) "급여평균", ROUND(SUM(sal)) "급여합계"
        FROM emp
        GROUP BY deptno;
 
 
   DEPTNO   COUNT(*)   급여평균   급여합계
--------- ---------- ---------- ----------
       10             3             2998         8995
       20             5             2175        10875
       30             6             1567         9400



예제2)업무별로 그룹하여  업무, 인원수,  평균 급여액, 최고 급여액, 최저 급여액 및 합계를 출력하라.
 
SQL>SELECT job, COUNT(empno) "인원수", AVG(sal) "평균급여액",
                   MAX(sal) "최고급여액", MIN(sal) "최저급여액", SUM(sal)

                   "급여합계"
        FROM emp
        GROUP BY job
 
JOB           인원수 평균급여액 최고급여액 최저급여액   급여합계
--------- ---------- ---------- ---------- ---------- ----------
ANALYST            2        3000        3000         3000       6000
CLERK                4      1037.5        1300          800       4150
MANAGER           3        2840        2975         2695       8520
PRESIDENT         1        5000        5000         5000       5000
SALESMAN          4        1400        1600         1250       5600

 

 


GROUP BY의 HAVING 절

 -  WHERE절에 GROUP Function을 사용할 수 없습니다.

 -  HAVING절은 GRUOP 함수를 가지고 조건비교를 할 때 사용 합니다.

 -  WHERE → GRUOP BY → HAVING → ORDER BY순으로  쿼리문이

    와야 됩니다.
 

HAVING절 예제


예제1) 사원수가 5명이 넘는 부서의 부서명과 사원수를 출력해라

SQL>SELECT b.dname, COUNT(a.empno)
        FROM emp a, dept b
        WHERE a.deptno = b.deptno
        GROUP BY dname
        
HAVING COUNT(a.empno) > 5

DNAME                                    COUNT(A.EMPNO)
-------------------------------      --------------
RESEARCH                                                6
SALES                                                      6


예제2)
전체 월급이 5000을 초과하는 각 업무에 대해서 업무와 월급여 합계를 출력하여라. 단 판매원은 제외하고 월 급여 합계로 내림차순 정렬 하여라.
 
SQL>SELECT job, SUM(sal) "급여합계"    -- 업무와 급여 합계를 출력
        FROM emp  
        WHERE job NOT IN (’SALES’)          -- 판매원은 제외
        GROUP BY job                             -- 업무별로 Group By 
        HAVING SUM(sal) > 5000               -- 전체 월급이 5000을 초과하는
        ORDER BY SUM(sal) DESC;            -- 월급여 합계로 내림차순 정렬
 
 
JOB         급여합계
--------- ----------
MANAGER        8520
ANALYST         6000
SALESMAN       5600