GROUPING SETS에 대해 자세히 알고싶습니다. 0 4 2,164

by DONKEY 함수 GROUPING SETS [2016.04.19 10:56:02]


     SELECT DECODE(GROUPING(C.DEPT_NM),1,'[총계]',C.DEPT_NM)  AS POS_DEPT_NM
           ,B.EMP_NO                                        
           ,B.KOR_NM
           ,DECODE(GROUPING_ID(D.COM_NM,C.DEPT_NM),2,'[부서계]',D.COM_NM)   AS OCP_POS_NM
           ,NVL(SUM(A.OCUR_YY),0)                           AS OCUR_YY
           ,NVL(SUM(A.ADD_YY),0)                            AS ADD_YY
           ,NVL(SUM(A.MTH_MM),0)                            AS MTH_MM
           ,NVL(SUM(A.YEARMTH_TOT),0)                       AS YEARMTH_TOT
           ,NVL(SUM(A.USE_YY),0)                            AS USE_YY
           ,NVL(SUM(A.TOT_AL_USED_TIME_DAY),0)              AS HDAY_DAY
           ,NVL(SUM(A.REM_YY),0)                            AS REM_YY
           ,NVL(SUM(E.HDAY_DURATION),0)                     AS MENSTRUAL_LEAVE
       FROM MID_ORDYEARSTU A
           ,MIJ_EMPLOYE    B
           ,OCS.ZMM_DEPT   C
           ,(SELECT COM_CD,COM_NM 
               FROM OCS.ZMM_COM_CD
              WHERE DIV_CD = 'OCP_POS_CD') D
           ,(SELECT HDAY_DURATION,EMP_NO
               FROM MID_HDAY
              WHERE HDAY_CD = '20') E
      WHERE A.WK_YY = I_YYYY
        AND B.POS_DEPT_CD LIKE I_POS_DEPT_CD || '%'
        AND A.EMP_NO LIKE I_EMP_NO || '%'
        AND A.EMP_NO = B.EMP_NO
        AND B.POS_DEPT_CD = C.DEPT_CD 
        AND B.OCP_POS_CD = D.COM_CD
        AND A.EMP_NO = E.EMP_NO(+)
        AND 1 = (CASE WHEN I_LBRUN_GB = '%' THEN 1
                      WHEN I_LBRUN_GB = 'L' AND B.LBRUN_FR_YMD IS NOT NULL AND B.LBRUN_TO_YMD IS NULL THEN 1
                      ELSE 0
                      END)
   GROUP BY GROUPING SETS((C.DEPT_NM,B.EMP_NO,B.KOR_NM,D.COM_NM),(C.DEPT_NM),())
;

제가 부서별 소계 합계를 내기 위해 가끔 사용하는 그룹 함수 입니다.

구루비에서 강좌를 보고 쿼리를 짜긴 짜는데 이런 형태말고 다른 경우에는 어떻게 사용 될 수 있는지 궁금합니다.

위와 같이 GROUPING SETS 첫번째 인수에는 SELECT 절에 사용할 컬럼들을 적고 있고 두번째 인수에는 부서별

소계를 내는 컬럼을 적고 있습니다. 보통 부서별 총계 소계 낼 경우 밖에없어서 이렇게 쓰고 있는데

이 함수를 이용해서 다르게 쓰이는 경우나 다른 함수를 사용해서 위에서 사용된GROUPING SETS와 같은

결과 값을 내는 방법을 알고 싶습니다.

 

by 마농 [2016.04.19 13:35:14]

GROUPING SETS 는 서로 다른 기준으로 집계할 때 주로 사용합니다.
위와 같이 소계와 총계를 구할 때는 주로 ROLLUP 을 사용하지요.
GROUP BY ROLLUP(c.dept_nm, (b.emp_no, b.kor_nm, d.com_nm))


by DONKEY [2016.04.19 14:08:06]

서로 다른 기준이라는게 예를들어 소속 부서별 소계, 근무 부서별 소계, 총계를 내는 거라고 이해하면 되는건가요???


by 마농 [2016.04.19 16:58:28]

서로 다른 기준이라는건 연관성이 없어보이는 별개의 기준 같은거죠.
물론 제가 생각하는 그냥 개념적인 기준일 뿐입니다.
어떤 구문을 사용하든 결과는 같게 나오겠지요.
예를 들면 성별 집계와 연령별 집계를 각각 따로 구해야 할 때.


GROUP BY GROUPING SETS ((성별),(연령))
성별, 연령, 건수
----------------
남성, null, 1000
여성, null, 2000
null, 10대, 1700
null, 20대, 1300


ROLLUP 은 연관성 있는 분류체계 같은 거죠.
대,중,소 별 집계에서 소계와 총계 등을 낼 때 사용하죠.


GROUP BY ROLLUP(성별,연령)
성별, 연령, 건수
----------------
남성, 10대,  700
남성, 20대,  300
남성, null, 1000
여성, 10대, 1300
여성, 20대,  700
여성, null, 2000
null, null, 3000


by DONKEY [2016.04.20 09:22:02]

감사합니다 추가 설명으로 이해했습니다 ㅎㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입