본문 바로가기
Develop/DATABASE

오라클)GROUP BY 절 - GROUP BY

by 걸어다니는 종합병원 2022. 12. 14.
반응형

GROUP BY 절은 WHERE 절 다음에 기술하며, WHERE 절이 수행되 후 수행.

 

쿼리문 수행 순서

SELECT 5번째
FROM 1번째
WHERE 2번째
GROUP BY 3번째
HAVING 4번째
ORDER BY 6번째

샘플 쿼리


GROUP BY 절 - GROUP BY expr [, expr}] ...

expr로 행 그룹을 생성하고, 생성된 행 그룹을 하나의 행으로 그룹핑 함

GROUP BY 절에  NULL이나 ()를 기술하면 전체 행이 하나의 행 그룹으로 처리 됨.

SELECT SUM(sal) AS c1 FROM emp WHERE  sal > 2000;

해당 쿼리문과 동일한 결과를 나타냄.


deptno별 sal의 합계 값을 집계

DEPTNO JOB SAL 그룹 C1
10 MANAGER 2450 10 7450
10 PRESIDENT 5000
20 ANALYST 3000 20 8975
20 ANALYST 3000
20 MANAGER 2975
30 MANAGER 2850 30 2850

위의 표처럼 그룹으로 그룹핑된다.


deptno, job별 sal의 합계 값을 그룹핑

DEPTNO JOB SAL 그룹 C1
10 MANAGER 2450 10, MANAGER 2450
10 PRESIDENT 5000 10, PRESIDENT 5000
20 ANALYST 3000 20, ANALYST 6000
20 ANALYST 3000
20 MANAGER 2975 20, MANAGER 2975
30 MANAGER 2850 30, MANAGER 2850

위의 표처럼 그룹으로 그룹핑 된다.


1. 에러 발생

SELECT deptno, sal FROM emp WHERE sal > 2000 GROUP BY deptno;
SELECT deptno FROM emp WHERE sal > 2000 GROUP BY deptno ORDER BY sal;

2. 정상 처리(집계함수 사용)

SELECT deptno, SUM(sal) AS sal FROM emp WHERE sal > 2000 GROUP BY deptno;
SELECT deptno FROM emp WHERE sal > 2000 GROUP BY deptno ORDER BY SUM(sal);
SELECT AVG(SUM(sal)) AS c1 FROM emp WHERE sal > 2000 GROUP BY deptno;

※ GROUP BY 절을 사용한 쿼리는 SELECT 절과 ORDER BY 절에 GROUP BY 절의 표현식이나 집계 함수를 사용한 표현식만 기술할 수 있으며, 그 외 표현식을 넣으면 에러가 발생한다.



집계 함수를 사용한 쿼리(위)는 WHERE절을 만족하는 행이 없더라도 하나의 행을 반환하지만, GROUP BY 절을 사용(아래)하면 결과가 반환되지 않는다.


SELECT job
      ,SUM(DECODE(deptno, 10, sal)) AS d10_sal
      ,SUM(DECODE(deptno, 20, sal)) AS d20_sal
      ,SUM(DECODE(deptno, 30, sal)) AS d30_sal
      ,SUM(DECODE(deptno, 40, sal)) AS d40_sal
    FROM emp GROUP BY job ORDER BY 1;

2차원 형태(deptno별, job별)의 집계 결과

 

반응형

댓글