그룹함수 CUBE
내용 연결을 위한 -_- 저번글의 마지막..

-----------------------------------------------------------------------
여기서 문제...!!

각각의 하나의 컬럼에 대해서 모든 집계 가 필요하다면 어떻게 해야할까나???

company_cd , customer_cd  별 집계 ,
customer_cd , subject          별 집계
company_cd , subject          별 집계
company_cd , customer_cd ,  subject  각각의 집계등등... 모든 경우의 수..

-----------------------------------------------------------------------
이걸 해결할려면 -_-; 모든 경우의 수 GROUPING 해서 Union All 로 하면 된다는거야 다 아는 것이겠지만 ,
그렇게 안하기 위한것이 !! 함수를 쓰는 목적이니깐;

이런경우 사용하는것이 CUBE ..!!!!!

역시..나 함수 설명 생략...

데이터웨어 하우스 수업을 들은 사람이라면 알겠지만 , 모르는 사람은 ;;
정육면체 큐브 를 생각하면 된다..
영화말고 -_- 그..퍼즐게임;;

GROUP BY Rollup ( company_cd , customer_cd ,  subject ) 을

GROUP BY CUBE ( company_cd , customer_cd ,  subject ) 로 수정해보자.


SELECT    '200612'           as tran_date ,
                 NVL(company_cd,'*') as company ,
                 NVL(customer_cd,'*')as customer,
                 NVL(subject,'*')    as subject,
                 sum(amt) as amt ,
                CASE GROUPING_ID( company_cd , customer_cd ,  subject)
                    WHEN BIN_TO_NUM(0,0,0) THEN 'date별 합계'
                    WHEN BIN_TO_NUM(0,0,1) THEN 'date,Subject별 합계'
                    WHEN BIN_TO_NUM(0,1,1) THEN 'date,Subject,customer_cd 별 합계'
                    WHEN BIN_TO_NUM(1,1,1) THEN '총 합계'
                    ELSE NULL
               END  as depth_level
    FROM   t_darkneo
    GROUP BY CUBE ( company_cd , customer_cd ,  subject )
결과:

TRAN_DATE COMPANY    CUSTOMER   SUBJECT    AMT                    DEPTH_LEVEL                  
--------- ---------- ---------- ---------- ---------------------- -----------------------------
200612    *          *          *          1800                   총 합계                      
200612    *          *          AAA        300                                                 
200612    *          *          BBB        600                                                 
200612    *          *          CCC        900                                                 
200612    *          77777      *          200                                                 
200612    *          77777      AAA        200                                                 
200612    *          88888      *          400                                                 
200612    *          88888      BBB        400                                                 
200612    *          99999      *          1200                                                
200612    *          99999      AAA        100                                                 
200612    *          99999      BBB        200                                                 
200612    *          99999      CCC        900                                                 
200612    11111      *          *          900                    date,Subject,customer_cd 별 합계
200612    11111      *          AAA        300                                                 
200612    11111      *          BBB        600                                                 
200612    11111      77777      *          200                    date,Subject별 합계          
200612    11111      77777      AAA        200                    date별 합계                  
200612    11111      88888      *          400                    date,Subject별 합계          
200612    11111      88888      BBB        400                    date별 합계                  
200612    11111      99999      *          300                    date,Subject별 합계          
200612    11111      99999      AAA        100                    date별 합계                  
200612    11111      99999      BBB        200                    date별 합계                  
200612    22222      *          *          900                    date,Subject,customer_cd 별 합계
200612    22222      *          CCC        900                                                 
200612    22222      99999      *          900                    date,Subject별 합계          
200612    22222      99999      CCC        900                    date별 합계

26 rows selected

음..26건이나 출력 되는군...

왜 이렇게 나오냐..CUBE 는 조건의 모든 경우의 수의 합이기 떄문에..

간단하게 애기하면 ;;

GROUP BY CUBE ( company_cd , customer_cd ,  subject  )
 =  GROUP BY ROLLUP ( company_cd )
     UNION ALL
    GROUP BY ROLLUP ( company_cd , customer_cd )
     UNION ALL
    GROUP BY ROLLUP ( company_cd , customer_cd ,  subject  )
     UNION ALL
    GROUP BY ROLLUP ( customer_cd )
     UNION ALL
    GROUP BY ROLLUP ( customer_cd , company_cd , subject   )
     UNION ALL

........ 넘 길다 -_- 생략하자;

암튼..고등학교 1? 학년 떄 배운..경우의 수를 생각하자 , 그렇게 되는것이다..=ㅁ=

좀 더 이해하기 쉽기 위하여..

데이터 한건에 대해서 만 Cube 함수를 적용해보자..

SELECT     NVL(company_cd,'*') as company ,
                 NVL(customer_cd,'*')as customer,
                 NVL(subject,'*')    as subject,
                 sum(amt) as amt ,
                 CASE GROUPING_ID( company_cd , customer_cd ,  subject)
                    WHEN BIN_TO_NUM(0,0,0) THEN '원래DATA'
                    WHEN BIN_TO_NUM(0,0,1) THEN 'Subject별 합계'
                    WHEN BIN_TO_NUM(0,1,0) THEN 'customer_cd별 합계'
                    WHEN BIN_TO_NUM(0,1,1) THEN 'customer_cd,Subject 별 합계'
                    WHEN BIN_TO_NUM(1,0,0) THEN 'company_cd별 합계'
                    WHEN BIN_TO_NUM(1,0,1) THEN 'company_cd,subject별 합계'
                    WHEN BIN_TO_NUM(1,1,0) THEN 'company_cd,customer_cd별 합계'
                    WHEN BIN_TO_NUM(1,1,1) THEN '총 합계'
                    ELSE NULL
                END  as depth_level,
                CASE GROUPING_ID( company_cd , customer_cd ,  subject)
                    WHEN BIN_TO_NUM(0,0,0) THEN 0
                    WHEN BIN_TO_NUM(0,0,1) THEN 1
                    WHEN BIN_TO_NUM(0,1,0) THEN 2
                    WHEN BIN_TO_NUM(0,1,1) THEN 3
                    WHEN BIN_TO_NUM(1,0,0) THEN 4
                    WHEN BIN_TO_NUM(1,0,1) THEN 5
                    WHEN BIN_TO_NUM(1,1,0) THEN 6
                    WHEN BIN_TO_NUM(1,1,1) THEN 7
                    ELSE NULL
               END  as depth_level_cnt               
     FROM   t_darkneo
    WHERE  TRAN_DATE = '20061201'
    AND    company_cd = '11111'
    AND    customer_cd = '99999'  
    GROUP BY CUBE ( company_cd , customer_cd ,  subject )
    ORDER BY depth_level_cnt



쿼리를 조금 보기 좋게 수정했지.. 보기 좋으라고 친절하게 depth_level_cnt  정렬도 해주고..;;

자 그러면....~

결과는 몇건??


네이버는 Extended Entries 기능이 없어서 정말 안좋은듯..

이거..쩝쩝;;

결과는 CASE 문만 보아도 결과는 알수 있을듯!!



COMPANY    CUSTOMER   SUBJECT    AMT                    DEPTH_LEVEL                DEPTH_LEVEL_CNT       
---------- ---------- ---------- ---------------------- -------------------------- ----------------------
11111      99999    AAA     100                    원래DATA                                                    0                     
11111      99999    *          100                    Subject별 합계                                             1                     
11111      *          AAA     100                    customer_cd별 합계                                      2                     
11111      *          *          100                    customer_cd,Subject 별 합계                         3                     
*            99999    AAA     100                    company_cd별 합계                                      4                     
*            99999    *          100                    company_cd,subject별 합계                          5                     
*            *          AAA     100                    company_cd,customer_cd별 합계                   6                     
*            *          *          100                    총 합계                                                        7         

8 rows selected

8건..!!

왜 !! 냐고 물으신다면..

GROUP BY CUBE ( company_cd , customer_cd ,  subject ) 조건이 3개이니깐

2의3승 = 8

이 나오는거지...


주의사항? 

당연하지만,  CUBE 함수는 조건의 갯수 에  2N 만큼 비례 하므로
데이터가 많고... 조건이 많아질수록 -_- 엄청난 쿼리 시간이 소비된다..

난 16개의 조건을 걸고 테스트 한다고 SQL 실행했다가..-_-; 엄청난 시간의 압박에 멈추었다가..
강제종료 해버렸는데 -_- 그게 쿼리가 실제로  계속 DB서버 에서 실행되고 있어서..
그날 -_-시스템이 엄청 버벅거렸지 .~~



여기서...!!!!!

-------------------------------------------------------------------
    GROUP BY ROLLUP ( company_cd , customer_cd ,  subject  )
     UNION ALL
    GROUP BY ROLLUP ( customer_cd )
     UNION ALL
    GROUP BY ROLLUP ( company_cd , subject   )
이런 데이터만 필요하다면??
CUBE 의 모든 경우의 수가 아닌 불특정? 몇몇 의 조건만 필요한경우.어떻게??

HAVING 이나WHERE 문에서
depth_level 조건을 주는것은? 어떨까??
-------------------------------------------------------------------

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by darkneo | 2007/01/05 14:56 | 트랙백 | 덧글(0)
트랙백 주소 : http://darkneo.egloos.com/tb/2918306
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >
rss

skin by 이글루스