[ Oracle - GROUPING / GROUPING_ID ]

 

 

☞ GROUPING_ID

 

정의 : GROUPING_ID함수는 행과 관련되는 GROUPING 비트 벡터에 대응되는 수치를 반환.
       GROUPING_ID함수는 행과 관련된 GROUPING 비트 벡터에 대응하는 수치를 반환한다. 
        GROUPING_ID는 ROLLUP,CUBE,GROUPING함수와 같은 GROUP BY 확장 기능을 포함한 SELECT문장에서
       적용할수 있다. 많은 GROUP BY 표현을 가지는 쿼리에서,많은 GROUPING함수를 필요로 하는 
       특정한 행의 GROUP BY 레벨을 지정하기 위해서는 복장한 SQL이 요구된다. 
       GROUPING_ID는 이런 경우 유용하다.

       GROUPING_ID함수는 다수의 GROUPING함수의 결과와 비트 벡터(1과 0의 문자열)를 연결하는 것과
       동일하다. GROUPING_ID를 이용하여서 다수의 GROUPING함수를 사용하지 않고서,
       표현하기 위한 행의 필터 조건이 간단해진다. 행 필터링은 원하는 행이 GROUPING_ID=n의 
       단일 조건으로 정의 될수 있어서 더 쉬워진다. 
       함수는 단일 테이블에서 다수의 집계의 레벨을 저장할때 유용하다.

SQL 예 : SELECT channel_id, promo_id, sum(amount_sold) s_sales  
               , 
GROUPING(channel_id) gc
              , 
GROUPING(promo_id) gp
              , 
GROUPING_ID(channel_id, promo_id) gcp
              , 
GROUPING_ID(promo_id, channel_id) gpc 
         
FROM   sales 
         
WHERE  promo_id > 496 
         
GROUP BY CUBE(channel_id, promo_id) ;  

결과)

    
C  PROMO_ID      S_SALES       GC         GP        GCP       GPC 
    - ----------   ---------- ---------- ---------- ---------- ---------- 
    C        497     26094.35       0         0         0         0 
    C        498      22272.4       0         0         0         0 
    C        499      19616.8       0         0         0         0 
    C       9999     87781668       0         0         0         0 
    C              87849651.6       0        
 1         1         2 
    I        497      50325.8       0         0         0         0 
    I        498      52215.4       0         0         0         0 
    I        499     58445.85       0         0         0         0 
    I       9999    169497409       0         0         0         0 
    I               169658396       0         
1         1         2 
    P        497     31141.75       0         0         0         0 
    P        498      46942.8       0         0         0         0 
    P        499        24156       0         0         0         0 
    P       9999     70890248       0         0         0         0 
    P              70992488.6       0         
1         1         2 
    S        497    110629.75       0         0         0         0 
    S        498     82937.25       0         0         0         0 
    S        499     80999.15       0         0         0         0 
    S               267480357       0         
1         1         2 
    T        497       8319.6       0         0         0         0 
    T        498      5347.65       0         0         0         0 
    T        499        19781       0         0         0         0 
    T       9999     28095689       0         0         0         0 
    T              28129137.3       0         
1         1         2 
             497    226511.25       
        0         2         1 
             498     209715.5       
1         0         2         1 
             499     202998.8       
1         0         2         1 
             9999    623470805       
1         0         2         1 
                     624110031       
1         1         3         
3 

설명)
   1. 
GROUPING(channel_id) gc
         : 0 -> channel_id가 Record에 나오는 ROW는 0
                즉, CUBE, ROLL_UP 후 해당 컬럼별로 SUM한 결과가 나오는 ROW는 0
           1 -> channel_id가 Record에 나오지 않는 ROW는 1

                즉, CUBE, ROLL_UP 후 총 SUM한 결과가 나오는 ROW는 1


   2. 
GROUPING_ID(channel_id, promo_id) gcp
         : 0 -> channel_id, promo_id 가 Record에 나오는 ROW는 0

           1 -> channel_id는 존재하고, promo_id는 미존재하는 Record일 경우 ROW는 1

           2 -> channel_id는 미존재하고, promo_id는 존재하는 Record일 경우 ROW는 2

           .... 

 


 
 

 

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Posted by 농부지기
,