본문 바로가기

프로그램

[ORACLE]GROUP BY GROUPING SETS

반응형

[ORACLE]GROUP BY GROUPING SETS



통계 쿼리 작성 시 

동일쿼리를 GROUP BY 에서 넣고 빼고 차이로 UNION ALL 로 처리하였다.


이 쿼리가 속도가 나지 않아 검색을 해보니 

GROUPING SETS 명령어가 제공되고 있고 속도도 괜찮다고 해서 변경해보았다.


효과는 꽤 좋았다.



GROUP BY GROUPING SETS 뒤에 그룹핑 할 그룹들을 넣으면 됨


GROUPING_ID 명령어를 통해 NULL 인 항목이 있을 경우 값을 반환받을 수 있다.

(NULL갯수 * 2 - 1 인듯함)


샘플


WITH CV_MST AS (

    SELECT '한국' AS COUNTRY, '서울' DOMAIN, 'M' AS SEX, '승구' AS USER_NM, '1000' AS AMT FROM DUAL UNION ALL

    SELECT '중국', '베이징', 'F', '루루', '9800' FROM DUAL UNION ALL

    SELECT '태국', '방콕', 'F', '뽕따', '3020' FROM DUAL UNION ALL

    SELECT '한국', '경기도', 'F', '혜뽕', '43020' FROM DUAL UNION ALL

    SELECT '한국', '경기도', 'F', '진뽕', '4340' FROM DUAL UNION ALL

    SELECT '한국', '경기도', 'M', '시샵', '3828' FROM DUAL UNION ALL

    SELECT '중국', '홍콩', 'M', '주윤발', '3929' FROM DUAL UNION ALL

    SELECT '중국', '홍콩', 'F', '장국영', '2939' FROM DUAL UNION ALL

    SELECT '중국', '상하이', 'F', '왕페이', '2080' FROM DUAL 

SELECT COUNTRY

    , DOMAIN

    , SEX

    , USER_NM 

    , SUM(AMT) AS AMT

    , GROUPING_ID(COUNTRY, DOMAIN, SEX, USER_NM) AS GRP_ID /*null인 항목이 있음 값 상승, null인 항목이 있을 경우 처리됨, n * 2 - 1 인듯*/

FROM CV_MST

GROUP BY GROUPING SETS 

(

    (

        COUNTRY

        , DOMAIN

        , SEX

        , USER_NM

    )

    , (

        COUNTRY

        , DOMAIN

    )

    , (

        '*'

    )

)