[SQLD] 그룹함수

Shy·2024년 5월 21일

SQLD

목록 보기
20/23

그룹 함수

1️⃣ 데이터 분석 개요

ANSI/ISO SQL 표준은 데이터 분석을 위해 세 가지 주요 함수를 정의하고 있다

  1. 집계 함수(Aggregate Function)
  2. 그룹 함수(Group Function)
  3. 윈도우 함수(Window Function)

1. Aggregate Function (집계 함수)

Aggregate Function은 주어진 데이터 집합에 대해 계산을 수행하여 단일 값을 반환하는 함수입니다. 주요 집계 함수는 다음과 같다.

  • COUNT(): 데이터 항목의 개수를 센다.
  • SUM(): 데이터 항목의 합계를 구한다.
  • AVG(): 데이터 항목의 평균을 계산한다.
  • MAX(): 데이터 항목 중 최대값을 찾는다.
  • MIN(): 데이터 항목 중 최소값을 찾는다.

이 함수들은 GROUP BY 절과 함께 사용되어 데이터 그룹별로 요약된 정보를 제공할 수 있다.

2. Group Function (그룹 함수)

Group Function은 그룹별로 데이터를 집계하여 다양한 레벨의 결산 보고서를 만들 때 유용한다. 주요 그룹 함수는 다음과 같다.

  • ROLLUP
    • 여러 레벨의 소계를 계산한다.
    • 예를 들어, 시간 및 지역별로 계층적 분류를 포함한 데이터를 집계할 때 유용하다.
  • CUBE
    • 가능한 모든 조합에 대해 다차원적인 집계를 생성한다.
    • 다양한 데이터를 얻는 데 유리하지만, 시스템 부하가 크다.
  • GROUPING SETS
    • 특정 항목에 대한 소계를 계산한다.
    • 원하는 부분의 소계만 쉽게 추출할 수 있는 장점이 있다.

이 함수들은 GROUP BY 절의 확장 형태로, 데이터를 한 번만 읽어서 빠르게 리포트를 생성할 수 있도록 돕는다. 또한, GROUPING 함수와 CASE 함수를 이용하여 다양한 형식의 보고서를 작성할 수 있다.

3. Window Function (윈도우 함수)

Window Function분석 함수(Analytic Function) 또는 순위 함수(Rank Function)로도 불리며, 데이터웨어하우스 환경에서 발전한 기능입니다. 이 함수들은 데이터의 특정 집합(window) 내에서 계산을 수행한다. 주요 윈도우 함수는 다음과 같다.

  • RANK(): 데이터 항목의 순위를 매긴다.
  • DENSE_RANK(): 중복 순위를 제외하고 순위를 매긴다.
  • ROW_NUMBER(): 각 데이터 항목에 고유한 순번을 부여한다.
  • NTILE(n): 데이터를 n개의 그룹으로 나눈다.
  • LEAD() / LAG(): 특정 행 기준으로 앞이나 뒤의 값을 가져온다.

이 함수들은 데이터 집합 내에서 여러 행에 걸쳐 계산을 수행할 수 있어 복잡한 분석 작업에 유용하다. 예를 들어, 이동 평균, 누적 합계 등을 계산할 때 사용된다.

2️⃣ ROULLUP 함수

1. ROLLUP 함수 개요

ROLLUP 함수는 데이터의 다차원 집계를 쉽게 계산하기 위한 SQL의 기능 중 하나이다. GROUP BY 절과 함께 사용되며, 주어진 그룹 컬럼 리스트에 대해 소계를 포함한 여러 레벨의 집계 결과를 생성한다. ROLLUP 함수는 N개의 그룹 컬럼에 대해 N+1 레벨의 소계를 생성합니다. 이는 데이터의 계층 구조를 반영하기 때문에 인수의 순서가 중요하다.

2. ROLLUP 함수의 동작 원리

  • 일반적인 GROUP BY: 주어진 컬럼에 대해 데이터 집계를 수행한다.
  • ROLLUP (col1, col2, …): col1, col2, … 의 순서대로 계층적 소계를 계산한다. 예를 들어, ROLLUP (DNAME, JOB)은 부서별로 업무별 소계를 계산하고, 최종적으로 모든 부서와 업무에 대한 총계를 계산한다.

3. 예제와 단계별 설명

STEP1: 일반적인 GROUP BY 절 사용

부서명(DNAME)과 업무명(JOB) 기준으로 사원 수와 급여 합계를 집계한다.

SELECT DNAME, JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB;
DNAMEJOBTotal EmplTotal Sal
SALESMANAGER12850
SALESCLERK1950
ACCOUNTINGMANAGER12450
RESEARCHANALYST26000
ACCOUNTINGCLERK11300
SALESSALESMAN45600
RESEARCHMANAGER12975
ACCOUNTINGPRESIDENT15000
RESEARCHCLERK21900

STEP 1-2: GROUP BY 절 + ORDER BY 절 사용

정렬된 결과를 얻기 위해 ORDER BY 절을 추가한다.

SELECT DNAME, JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB
ORDER BY DNAME, JOB;

STEP 2: ROLLUP 함수 사용

ROLLUP 함수를 사용하여 소계와 총계를 계산한다.

ROLLUP(DNAME, JOB)는 다음과 같은 계층 구조로 소계를 계산한다.

  1. DNAME과 JOB별 집계: 각 부서(DNAME) 내의 각 업무(JOB)별 집계를 계산한다.
  2. DNAME별 집계: 각 부서(DNAME) 내의 모든 업무(JOB)의 소계를 계산한다.
  3. 전체 총계: 모든 부서(DNAME)와 업무(JOB)에 대한 총계를 계산한다.
SELECT DNAME, JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);
DNAMEJOBTotal EmplTotal Sal
SALESCLERK1950
SALESMANAGER12850
SALESSALESMAN45600
SALES69400
RESEARCHCLERK21900
RESEARCHANALYST26000
RESEARCHMANAGER12975
RESEARCH510875
ACCOUNTINGCLERK11300
ACCOUNTINGMANAGER12450
ACCOUNTINGPRESIDENT15000
ACCOUNTING38750
1429025
  • 추가 집계 레벨
    • L1: 기본 집계 (9건) (각 DNAME(SALES, RESEARCH, ACCOUNTING)JOB(CLERK, MANAGER, SALESMAN)333*3)
    • L2: DNAME 별 JOB의 소계 (3건) -> JOB(CLERK, MANAGER, SALESMAN)
    • L3: 전체 총계 (1건)

DNAME과 JOB별 집계가 어떻게 되는지는, 다음과 같다.

  1. DNAME과 JOB별 집계
    • 각 부서(DNAME) 내의 각 업무(JOB)별 집계를 계산한다.
    • 예를 들어, ACCOUNTING 부서의 CLERK는 1명, 급여 총합은 1300이다.
  2. DNAME별 집계
    • 각 부서(DNAME) 내의 모든 업무(JOB)의 소계를 계산한다.
    • 예를 들어, ACCOUNTING 부서의 모든 업무에 대한 소계는 직원 수 3명, 급여 총합 8750이다.
  3. 전체 총계
    • 모든 부서와 업무에 대한 총계를 계산한다.
    • 모든 부서와 업무의 전체 총계는 직원 수 14명, 급여 총합 29025이다.

STEP 2-2: ROLLUP 함수 + ORDER BY 절 사용

ROLLUP과 ORDER BY를 함께 사용하여 정렬된 소계 결과를 얻는다.

SELECT DNAME, JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB)
ORDER BY DNAME, JOB;

STEP 3: GROUPING 함수 사용

ROLLUP 함수의 결과를 구분하기 위해 GROUPING 함수를 사용한다.

SELECT DNAME, GROUPING(DNAME), JOB, GROUPING(JOB), COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);
DNAMEDNAME_GROUPINGJOBJOB_GROUPINGTotal EmplTotal Sal
ACCOUNTING0CLERK011300
ACCOUNTING0MANAGER012450
ACCOUNTING0PRESIDENT015000
ACCOUNTING0NULL138750
RESEARCH0ANALYST026000
RESEARCH0CLERK01800
RESEARCH0MANAGER012975
RESEARCH0NULL149775
SALES0CLERK01950
SALES0MANAGER012850
SALES0SALESMAN045600
SALES0NULL169400
NULL1NULL11328125

STEP 4: GROUPING 함수 + CASE 사용

CASE 함수를 사용하여 집계 레코드에 원하는 텍스트를 표시한다.

SELECT CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
       CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs' ELSE JOB END AS JOB,
       COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);

Oracle DECODE 함수 사용 예는 다음과 같다.

SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
       DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
       COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);

STEP 4-2: ROLLUP 함수 일부 사용

GROUP BY 절의 일부 컬럼에만 ROLLUP을 적용한다.

SELECT CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
       CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs' ELSE JOB END AS JOB,
       COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, ROLLUP(JOB);

결과는 다음과 같다.

DNAMEJOBTotal EmplTotal Sal
SALESCLERK1950
SALESMANAGER12850
SALESSALESMAN45600
SALES69400
RESEARCHCLERK21900
RESEARCHANALYST26000
RESEARCHMANAGER12975
RESEARCH510875
ACCOUNTINGCLERK11300
ACCOUNTINGMANAGER12450
ACCOUNTINGPRESIDENT15000
ACCOUNTING38750

일부만 ROLLUP을 사용하여, All Departments, All Jobs가 나타나지 않는거다!!

STEP 4-3: ROLLUP 함수 결합 칼럼 사용

하나의 집합으로 여러 컬럼을 그룹화하여 ROLLUP을 적용한다.

SELECT DNAME, JOB, MGR, SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, (JOB, MGR));
DNAMEJOBMGRTotal Sal
SALESCLERK7698950
SALESMANAGER78392850
SALESSALESMAN76985600
SALES9400
RESEARCHCLERK77881100
RESEARCHCLERK7902800
RESEARCHANALYST75666000
RESEARCHMANAGER78392975
RESEARCH10875
ACCOUNTINGCLERK77821300
ACCOUNTINGMANAGER78392450
ACCOUNTINGPRESIDENT5000
ACCOUNTING8750
29025

  • ROLLUP 함수는 그룹별 소계와 총계를 계산하는 데 유용하다.
  • 인수 순서는 결과에 영향을 미치므로 주의해야 한다.
  • GROUPING 함수는 집계 레코드를 구분하는 데 사용된다.
  • CASE/DECODE 함수와 함께 사용하면 집계 결과에 사용자 정의 텍스트를 추가할 수 있다.

이와 같이 ROLLUP 함수를 활용하면 복잡한 데이터 집계를 쉽게 수행하고, 다양한 레벨의 요약 정보를 효율적으로 얻을 수 있다.

3️⃣ CUBE 함수

1. CUBE 함수 개요

CUBE 함수는 지정된 그룹 컬럼들에 대해 가능한 모든 조합의 다차원 집계를 생성하는 SQL 기능입니다. 이는 ROLLUP 함수보다 더 많은 조합을 다루며, 각 그룹 컬럼의 모든 가능한 값을 포함한 집계를 생성합니다. 이를 통해 복잡한 데이터 분석을 간단히 수행할 수 있지만, 시스템에 더 큰 부하를 주기 때문에 사용에 주의가 필요합니다.

2. CUBE 함수의 동작 원리

  • 다차원 집계: CUBE 함수는 그룹 컬럼의 모든 가능한 조합에 대해 소계를 생성한다.
  • 계층 구조 없음: ROLLUP 함수와 달리 CUBE 함수는 계층 구조가 없으며, 그룹 컬럼의 순서는 결과의 정렬에만 영향을 미친다.
  • 전체 총계 포함: 각 조합의 소계뿐만 아니라 전체 데이터에 대한 총계도 포함한다.

3. 예제와 단계별 설명

STEP 5: CUBE 함수 사용

부서명(DNAME)과 업무명(JOB)을 기준으로 집계하고, CUBE 함수를 사용하여 모든 조합의 집계를 생성한다.

SELECT CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
       CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs' ELSE JOB END AS JOB,
       COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE (DNAME, JOB);

실행 결과는 다음과 같다.

DNAMEJOBTotal EmplTotal Sal
All DepartmentsAll Jobs1429025
All DepartmentsCLERK44150
All DepartmentsANALYST26000
All DepartmentsMANAGER38275
All DepartmentsSALESMAN45600
All DepartmentsPRESIDENT15000
SALESAll Jobs69400
SALESCLERK1950
SALESMANAGER12850
SALESSALESMAN45600
RESEARCHAll Jobs510875
RESEARCHCLERK21900
RESEARCHANALYST26000
RESEARCHMANAGER12975
ACCOUNTINGAll Jobs38750
ACCOUNTINGCLERK11300
ACCOUNTINGMANAGER12450
ACCOUNTINGPRESIDENT15000
  • 결과 해석
    • 전체 총계: All DepartmentsAll Jobs 조합의 총계를 포함한다.
    • 각 부서의 전체 업무별 총계: 부서별로 All Jobs 조합의 소계를 포함한다.
    • 각 업무의 전체 부서별 총계: 업무별로 All Departments 조합의 소계를 포함한다.
    • 각 부서 및 업무의 조합별 소계: 모든 부서와 업무의 조합에 대해 소계를 포함한다.
  • CUBE 함수의 특징
    • 집계 레벨: 그룹 컬럼 수가 N이면 2N2^N개의 집계 레벨을 생성한다.
    • 결과의 크기: ROLLUP 함수보다 더 많은 집계 레벨을 생성하므로, 결과의 크기가 더 크다.
    • 시스템 부하: 모든 조합에 대해 집계를 수행하므로, 시스템 부하가 크다.
  • CUBE 함수와 ROLLUP 함수 비교
    • ROLLUP: 계층적 소계를 생성하며, 순서가 중요하다.
    • CUBE: 모든 가능한 조합에 대해 소계를 생성하며, 순서가 중요하지 않다.

STEP 5-2: UNION ALL 사용 SQL

CUBE 함수의 결과를 여러 SQL 쿼리를 UNION ALL로 합쳐서 얻는 방법이다.

SELECT DNAME, JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB
UNION ALL
SELECT DNAME, 'All Jobs', COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME
UNION ALL
SELECT 'All Departments', JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY JOB
UNION ALL
SELECT 'All Departments', 'All Jobs', COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO;

결과는 다음과 같다.

  1. 첫 번째 쿼리: 부서와 업무별 소계를 계산한다.
  2. 두 번째 쿼리: 부서별 전체 업무의 소계를 계산한다.
  3. 세 번째 쿼리: 업무별 전체 부서의 소계를 계산한다.
  4. 네 번째 쿼리: 전체 부서와 전체 업무의 총계를 계산한다.

  • CUBE 함수는 그룹 컬럼의 모든 가능한 조합에 대해 소계를 생성하는 다차원 집계 함수이다.
  • 사용 주의: 시스템 부하가 크므로 주의해서 사용해야 한다.
  • 비교: ROLLUP 함수는 계층적 소계를 생성하며, CUBE 함수는 모든 조합에 대해 소계를 생성한다.
  • 효율성: 여러 쿼리를 UNION ALL로 합치는 것보다 효율적이다.

이와 같이 CUBE 함수는 복잡한 데이터 분석 작업에서 매우 유용한 도구이다. 그러나 사용 시 시스템 성능에 주는 영향을 고려하여 신중하게 사용해야 한다.

4️⃣ GROUPING SETS 함수

1. GROUPING SETS 함수 개요

GROUPING SETS 함수는 SQL에서 다양한 소계 집합을 쉽게 만들 수 있게 해주는 기능이다. 이를 통해 여러 번의 GROUP BY 쿼리를 반복하지 않고도 다양한 집계 결과를 한 번에 얻을 수 있다. GROUPING SETS에 지정된 인수들은 평등한 관계를 가지며, 인수의 순서가 바뀌어도 결과에는 영향이 없다. 결과에 대한 정렬이 필요할 경우, ORDER BY 절을 사용해야 한다.

GROUPING 함수는 SQL에서 ROLLUP, CUBE, GROUPING SETS와 같은 집계 함수와 함께 사용되어, 결과 집합에서 특정 행이 소계를 나타내는지 아니면 일반적인 집계 결과를 나타내는지를 구분할 수 있도록 한다.

2. GROUPING SETS 함수의 동작 원리

  • 다양한 집계: GROUPING SETS 함수는 지정된 그룹의 조합들에 대해 각각의 집계를 생성한다.
  • 평등한 관계: 인수들 간에 계층 구조가 없기 때문에, 인수의 순서가 결과에 영향을 미치지 않는다.
  • 정렬: 결과를 정렬하려면 ORDER BY 절을 사용해야 한다.

3. GROUPING 함수의 동작 방식

  • GROUPING(column): 컬럼이 소계 또는 총계에 해당하면 1을 반환하고, 그렇지 않으면 0을 반환한다.
  • 이는 ROLLUP, CUBE, GROUPING SETS와 함께 사용될 때 유용하다.

4. 예제와 단계별 설명

일반 그룹함수를 이용한 SQL

부서별, 업무별 인원수와 급여 합을 구하는 쿼리이다.

SELECT DNAME, 'All Jobs' AS JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME
UNION ALL
SELECT 'All Departments' AS DNAME, JOB, COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY JOB;
DNAMEJOBTotal EmplTotal Sal
ACCOUNTINGAll Jobs38750
RESEARCHAll Jobs510875
SALESAll Jobs69400
All DepartmentsCLERK44150
All DepartmentsSALESMAN45600
All DepartmentsPRESIDENT15000
All DepartmentsMANAGER38275
All DepartmentsANALYST26000

GROUPING SETS 사용 SQL

GROUPING SETS를 이용하여 동일한 결과를 얻는 쿼리이다.

SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
       DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
       COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS (DNAME, JOB);
DNAMEJOBTotal EmplTotal Sal
All DepartmentsCLERK44150
All DepartmentsSALESMAN45600
All DepartmentsPRESIDENT15000
All DepartmentsMANAGER38275
All DepartmentsANALYST26000
ACCOUNTINGAll Jobs38750
RESEARCHAll Jobs510875
SALESAll Jobs69400

GROUPING SETS 사용 SQL - 순서 변경

GROUPING SETS의 인수 순서를 변경하여 동일한 결과를 얻는 쿼리이다.

SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME) AS DNAME,
       DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
       COUNT(*) AS "Total Empl", SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS (JOB, DNAME);
DNAMEJOBTotal EmplTotal Sal
All DepartmentsCLERK44150
All DepartmentsSALESMAN45600
All DepartmentsPRESIDENT15000
All DepartmentsMANAGER38275
All DepartmentsANALYST26000
ACCOUNTINGAll Jobs38750
RESEARCHAll Jobs510875
SALESAll Jobs69400

해당 쿼리문은 아래와 같이 동작한다.
먼저 GROUPING SETS (DNAME, JOB)는 다음과 같은 집계를 생성한다.

  1. 각 부서(DNAME)별로 모든 업무(JOB)의 소계
  2. 각 업무(JOB)별로 모든 부서(DNAME)의 소계

그 다음, GROUPING 함수를 보자.

  1. GROUPING(DNAME)
    • GROUPING(DNAME)는 DNAME 컬럼이 소계를 나타내는 경우 1을 반환하고, 그렇지 않으면 0을 반환한다.
    • DECODE(GROUPING(DNAME), 1, 'All Departments', DNAME)는 DNAME 컬럼이 소계를 나타내는 경우 'All Departments'를, 그렇지 않은 경우 실제 부서명을 반환한다.
  2. GROUPING(JOB)
    • GROUPING(JOB)는 JOB 컬럼이 소계를 나타내는 경우 1을 반환하고, 그렇지 않으면 0을 반환한다.
    • DECODE(GROUPING(JOB), 1, 'All Jobs', JOB)는 JOB 컬럼이 소계를 나타내는 경우 'All Jobs'를, 그렇지 않은 경우 실제 업무명을 반환한다

3개의 인수를 이용한 GROUPING SETS

부서, 업무, 매니저 별 집계와 그 조합별 집계를 구하는 쿼리이다.

SELECT DNAME, JOB, MGR, SUM(SAL) AS "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS ((DNAME, JOB, MGR), (DNAME, JOB), (JOB, MGR));
DNAMEJOBMGRTotal Sal
SALESCLERK7698950
ACCOUNTINGCLERK77821300
RESEARCHCLERK77881100
RESEARCHCLERK7902800
RESEARCHANALYST75666000
SALESMANAGER78392850
RESEARCHMANAGER78392975
ACCOUNTINGMANAGER78392450
SALESSALESMAN76985600
ACCOUNTINGPRESIDENTNULL5000
CLERKNULL7698950
CLERKNULL77821300
CLERKNULL77881100
CLERKNULL7902800
ANALYSTNULL75666000
MANAGERNULL78398275
SALESMANNULL76985600
PRESIDENTNULLNULL5000
SALESMANAGERNULL2850
SALESCLERKNULL950
ACCOUNTINGCLERKNULL1300
ACCOUNTINGMANAGERNULL2450
ACCOUNTINGPRESIDENTNULL5000
RESEARCHMANAGERNULL2975
SALESSALESMANNULL5600
RESEARCHANALYSTNULL6000
RESEARCHCLERKNULL1900
  1. 첫 번째 10개의 행은 (DNAME, JOB, MGR) 기준의 집계이다.
  2. 두 번째 8개의 행은 (JOB, MGR) 기준의 집계이다.
  3. 세 번째 9개의 행은 (DNAME, JOB) 기준의 집계이다.
  • GROUPING SETS 함수는 지정된 여러 그룹 조합에 대해 각각 집계를 생성하는 기능이다.
  • 인수의 순서는 결과에 영향을 미치지 않으며, 인수들은 평등한 관계를 가진다.
  • 정렬: 결과를 정렬하려면 ORDER BY 절을 사용해야 한다.
  • 효율성: 여러 번의 GROUP BY 쿼리를 반복하지 않고도 다양한 집계를 한 번에 수행할 수 있다.

GROUPING SETS 함수는 데이터 분석에서 다양한 집계 작업을 효율적으로 처리하는 데 매우 유용한 도구이다.


  • GROUPING SETS: 다양한 소계 집합을 한 번에 만들 수 있는 SQL 기능이다.
  • GROUPING 함수: 소계와 총계를 구분하는 데 사용되며, CASE 문과 함께 사용하여 결과를 명확하게 표시할 수 있다.
  • 효율성: GROUPING SETS는 여러 번의 GROUP BY 쿼리를 반복하지 않고도 다양한 집계 결과를 한 번에 얻을 수 있다.

이와 같이 GROUPING SETS와 GROUPING 함수를 사용하면, SQL 쿼리를 간결하게 유지하고 복잡한 데이터 집계 작업을 효율적으로 수행할 수 있다.

profile
신입사원...

0개의 댓글