`GROUPING SETS(DEPTNO, JOB, (DEPTNO), (JOB), ())` 함수의 실제 예시를 보여드리겠습니다. 이 구문은 지정된 여러 그룹화 조합에 대해 별도의 집계 결과를 생성합니다.
### 예시 데이터:
먼저, 예시 데이터를 포함하는 `EMPLOYEES` 테이블을 가정합니다:
```sql
CREATE TABLE EMPLOYEES (
DEPTNO INT,
JOB VARCHAR(50),
SALARY INT
);
INSERT INTO EMPLOYEES (DEPTNO, JOB, SALARY) VALUES (10, 'MANAGER', 1000);
INSERT INTO EMPLOYEES (DEPTNO, JOB, SALARY) VALUES (10, 'CLERK', 500);
INSERT INTO EMPLOYEES (DEPTNO, JOB, SALARY) VALUES (20, 'MANAGER', 1500);
INSERT INTO EMPLOYEES (DEPTNO, JOB, SALARY) VALUES (20, 'CLERK', 800);
INSERT INTO EMPLOYEES (DEPTNO, JOB, SALARY) VALUES (30, 'CLERK', 700);
```
### GROUP BY GROUPING SETS 구문:
```sql
SELECT DEPTNO, JOB, SUM(SALARY) AS TOTAL_SALARY
FROM EMPLOYEES
GROUP BY GROUPING SETS(
(DEPTNO, JOB),
(DEPTNO),
(JOB),
()
);
```
### 결과:
이 구문은 다음과 같은 결과를 생성합니다:
| DEPTNO | JOB | TOTAL_SALARY |
|--------|---------|--------------|
| 10 | MANAGER | 1000 | <-- (DEPTNO, JOB) 그룹
| 10 | CLERK | 500 | <-- (DEPTNO, JOB) 그룹
| 20 | MANAGER | 1500 | <-- (DEPTNO, JOB) 그룹
| 20 | CLERK | 800 | <-- (DEPTNO, JOB) 그룹
| 30 | CLERK | 700 | <-- (DEPTNO, JOB) 그룹
| 10 | NULL | 1500 | <-- (DEPTNO) 그룹
| 20 | NULL | 2300 | <-- (DEPTNO) 그룹
| 30 | NULL | 700 | <-- (DEPTNO) 그룹
| NULL | MANAGER | 2500 | <-- (JOB) 그룹
| NULL | CLERK | 2000 | <-- (JOB) 그룹
| NULL | NULL | 4500 | <-- 전체 합계
### 설명:
- `GROUPING SETS(DEPTNO, JOB)`는 각 `(DEPTNO, JOB)` 조합에 대해 그룹화합니다. 즉, 각 부서의 각 직업에 대한 급여 합계를 계산합니다.
- `GROUPING SETS((DEPTNO))`는 `DEPTNO`별로만 그룹화하여 각 부서의 총 급여를 계산합니다.
- `GROUPING SETS((JOB))`는 `JOB`별로만 그룹화하여 각 직업의 총 급여를 계산합니다.
- `GROUPING SETS(())`는 전체 합계를 계산합니다.
### 차이점:
이 구문은 `CUBE`와 유사하지만, `GROUPING SETS`를 사용하면 특정 그룹화 조합만 선택적으로 집계할 수 있습니다. 예를 들어, `(DEPTNO, JOB)`와 `(JOB, DEPTNO)`를 별도로 그룹화하지 않고, 각각 `(DEPTNO)`와 `(JOB)`에 대해서만 그룹화하는 식입니다.
따라서, `GROUPING SETS`는 `CUBE`처럼 모든 조합을 생성하지 않고, 필요에 따라 그룹화 조합을 지정하는 더 유연한 방법입니다.
![[Screenshot 2024-08-17 at 11.11.03 AM.png]]