반응형
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 | 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 | 그룹 | 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;
반응형
'Develop > DATABASE' 카테고리의 다른 글
오라클)HAVING 절 (0) | 2022.12.20 |
---|---|
오라클)GROUP BY 절 - ROLLUP, CUBE, GROUPING SETS, 조합 열, 연결 그룹, GROUPING 함수, GROUPING_ID 함수 (0) | 2022.12.15 |
오라클)KEEP 키워드 - DENSE_RANK (FIRST | LAST) (0) | 2022.10.29 |
오라클)집계 함수 - 기타 (LISTAGG) (0) | 2022.10.29 |
오라클)집계 함수 - 분포 함수(PERCENTILE_COUNT, PERCENTILE_DISC, MEDIAN) (1) | 2022.10.29 |
댓글