728x90
그룹함수
그룹함수에 조건문을 줄 때는 WHERE이 아닌 HAVING을 사용합니다.
WHERE과 HAVING의 차이는 그룹함수가 있고 없고 차이입니다.
--Q) 부서별 월급 합계를 구하자.(단, 월급의 합계가 7000 이상인 부서만 출력하자.)
SELECT DEPTNO, SUM(SAL) FROM EMP
HAVING SUM(SAL) >= 7000
GROUP BY DEPTNO;

1. ROLLUP
ROLLUP은 순차적으로 중간 합계를 출력합니다.
ROLLUP함수 안 컬럼의 순서가 바뀌면 결과도 바뀌게 됩니다.
ROLLUP의 출력 순서
--EX)
SELECT A, B, COUNT(*) FROM TMP GROUP BY ROLLUP(A,B);
A, B, COUNT(*)
UNION ALL
A, NULL, COUNT(8)
UNION ALL
NULL, NULL, COUNT(*)
--A컬럼, B컬럼에 대한 카운트 / A컬럼에 대한 카운트 / 전체 카운트
--Q) 직업, 부서 별 월급의 합을 출력하자.
SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(JOB, DEPTNO);

2. CUBE
CUBE는 모든 중간합께를 출력합니다.
CUBE의 출력 순서
SELECT A,B,COUNT(*) FROM TMP GROUP BY CUBE(A,B);
NULL, NULL, COUNT(*)
UNION ALL
NULL, B, COUNT(*)
UNION ALL
A, NULL, COUNT(*)
UNION ALL
A, B, COUNT(*)
--Q) 직업, 부서 별 월급의 합을 출력하자.(위와 같은 문제)
SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY CUBE(JOB, DEPTNO);

3. GROUPING SET
GROUPING SET은 원하는 결과를 출력하기 위한 셋팅입니다.
--Q) 직업, 부서 별 월급의 합을 출력하자.(위와 같은 문제)
SELECT JOB, DEPTNO, SUM(SAL)
FROM EMP
GROUP BY GROUPING SETS(ROLLUP(JOB,DEPTNO), DEPTNO);

728x90
'RDB > Oracle' 카테고리의 다른 글
[ORACLE] Top N Query(ROWID / ROWNUM) (0) | 2022.01.03 |
---|---|
[ORACLE] 정렬 - ORDER BY (0) | 2022.01.02 |
[ORACLE] UNION, UNION ALL, INTERSECT, MINUS (0) | 2021.12.31 |
[ORACLE] 집계함수 - COUNT, MAX, MIN, SUM, AVG (1) | 2021.12.30 |
[ORACLE] 기타 함수 - NVL, DECODE, CASE [WHEN ... THEN ...] END (0) | 2021.12.29 |