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