본문 바로가기
오라클 게시판/오라클 함수

[오라클 함수] GROUPING 함수

by 기서무나구물 2018. 11. 20.

포스팅 목차

    o GROUPING

     


    문법

     

    grouping::=

     


    목적 

    GROUPING함수는 ROLLUP이나 CUBE 연산자와 함께 사용하여 GROUPING 함수에 기술된 칼럼이 ROLLUP이나 CUBE 연산 시 사용이 되었는지를 보여 주는 함수이다.


    특별히 연산 기능은 없으며 ROLLUP이나 CUBE 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다.
    즉, GROUPING 함수를 이용할 경우 출력되는 결괏값 중 NULL값이 있다면 이 NULL값이 ROLLUP이나 CUBE 연산의 결과로 생성된 것인지, 원래 테이블상에 NULL값으로 저장된 것인지를 확인할 수 있다.
     

    GROUPING함수는 규칙적인 그룹화된 행에서부터 superaggregate을 구별한다. ROLLUP과 CUBE와 같은 GROUP BY의 확장 기능은 모든 값의 집합이 Null에 의해 나타나지는 superaggregate 행을 생성한다. GOUPING함수를 이용하면, 규칙적인 행의 null로부터 superaggregate 행의 모든 값의 집합을 나타내는 null을 구별할 수 있다.

     

    GROUPING 함수에서 expr은 GROUP BY구문에서 표현 중에 하나와 일치할 필요가 있다. 만약 행중의 expr의 값이 모든 값 집합에서 나타나는 null이라면, 1의 값을 반환한다. 그 이외의 경우에는 zero를 반환한다. GROUPING함수에 의해 반환되는 값의 데이터 형은 Oracle NUMBER이다. SELECT group_by_clause 를 참조.

    GROUPING 함수는 ROLLUP이나 CUBE 연산자와 함께 사용하여 GROUPING 함수에 기술된 칼럼이 그룹핑 시 즉, ROLLUP이나 CUBE 연산 시 사용이 되었는지를 보여 주는 함수이다. 특별히 연산 기능은 없으며 ROLLUP이나 CUBE 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다. 즉, GROUPING 함수를 이용할 경우 출력되는 결괏값 중 NULL값이 있다면 이 NULL값이 ROLLUP이나 CUBE 연산의 결과로 생성된 것인지, 원래 테이블상에 NULL값으로 저장된 것인지를 확인할 수 있다.

      • grouping 함수는 인수로 하나의 값만을 가질 수 있다.
      • grouping 함수에 사용된 인수는 GROUP BY 절에 기술된 값 중에 하나와 반드시 일치되어야 한다.
      • GROUPING 함수는 결괏값으로 0 또는 1을 리턴한다. 0 값을 리턴하는 경우, 해당 인수로 쓰인 값이 ROLLUP이나 CUBE 연산 시 사용되었음을 나타내는 것이고, 1 값을 리턴하는 경우 ROLLUP이나 CUBE 연산 시 사용되지 않았음을 나타낸다.

    * Group by에서 Rollup과 Cube 조건 참조

       


    예제 

    다음 예제는 hr.departments와 hr.employees테이블에서 만약 GROUPING 함수가 1을 반환했다면(테이블에서 규칙적 행보다 superaggregate행을 지적), 그때는 그 이외의 경우에 표시되는 null 대신에 문자열 "All Jobs"이 "JOB"열에 표시된다. (Rollup 결과로 발생하는 JOB의 NULL값을 "All Jobs"로 변경)

    Oracle Program
    SELECT DECODE(GROUPING(department_name), 1, 'All Departments', department_name) AS department,
           DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job,
           COUNT(*) "Total Empl", 
           AVG(salary) * 12 "Average Sal"
    FROM   employees e, departments d
    WHERE  d.department_id = e.department_id
    GROUP BY ROLLUP (department_name, job_id);

     

    Results
    DEPARTMENT                     JOB        Total Empl Average Sal
    ------------------------------ ---------- ---------- -----------
    Accounting                     AC_ACCOUNT          1       99600
    Accounting                     AC_MGR              1      144000
    Accounting                     All Jobs            2      121800
    Administration                 AD_ASST             1       52800
    Administration                 All Jobs            1       52800
    Executive                      AD_PRES             1      288000
    Executive                      AD_VP               2      204000
    Executive                      All Jobs            3      232000
    Finance                        FI_ACCOUNT          5       95040
    Finance                        FI_MGR              1      144000
    Finance                        All Jobs            6      103200

     

      --------------------------------------------  

    오라클 SQL 함수(Oracle SQL Function) 목록 리스트 링크

     

    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크
    반응형

    댓글