[ Oracle - GROUPING() 3 단계 ]

 

 

목표 : GROUPING, GROUPING_ID, GROUP_ID  대해서 알아 보기

☞  

 

1. GROUPING(name)
  - name 컬럼으로 GROUP BY 의해서 SUM 결과는 0, CUBE, ROLLUP 의해 합산된 결과는 1
2
. GROUPING_ID(name1, name2)
  - GROUPING(name1) || GROUPING(name2) 결과를 2진수로 판단해서  값을 10진수로 환산한 
  - ) 00 => 0
        01 => 1
        10 => 2
        11 => 3
3
. GROUP_ID()
   - ROLLUP이나 CUBE 의한 결과에서 중복된 자료가 존재시 구별가능하다.
   - 필요이유는 중복자료가 여러번 나올  있기 때문에 필터링하는데 유용하다.
   - 만약 n 특정 그룹핑에서 중복이 존재한다면, GROUP_ID 0~n-1 범위의 수를 반환한다.

 

WITH salary AS
(
    SELECT '총무부' DEPT, '저미주' NAME, '01' SMONTH, 100000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '저미주' NAME, '02' SMONTH, 115000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '저미주' NAME, '03' SMONTH, 112000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '강모리' NAME, '07' SMONTH, 510000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '강모리' NAME, '08' SMONTH, 450000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '강모리' NAME, '09' SMONTH, 610000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '구하라' NAME, '05' SMONTH, 210000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '구하라' NAME, '06' SMONTH, 210000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '구하라' NAME, '07' SMONTH, 210000 SALARY FROM dual UNION ALL
    SELECT '총무부' DEPT, '구하라' NAME, '08' SMONTH, 210000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '구하라' NAME, '01' SMONTH, 200000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '구하라' NAME, '02' SMONTH, 210000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '구하라' NAME, '03' SMONTH, 230000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '구하라' NAME, '04' SMONTH, 230000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '이주리' NAME, '01' SMONTH, 150000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '이주리' NAME, '02' SMONTH, 160000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '이주리' NAME, '03' SMONTH, 170000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '저미주' NAME, '04' SMONTH, 112000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '저미주' NAME, '05' SMONTH, 112000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '저미주' NAME, '06' SMONTH, 112000 SALARY FROM dual UNION ALL
    SELECT '인사부' DEPT, '저미주' NAME, '07' SMONTH, 112000 SALARY FROM dual
)
SELECT
 DEPT, NAME, COUNT(SMONTH) CNT, SUM(SALARY) SALARY
     , GROUPING(DEPT) G_DEPT, GROUPING(NAME) G_NAME
     , GROUPING(DEPT) + GROUPING(NAME) G_SUM
     , GROUPING_ID(DEPT, NAME) GING_ID
     , GROUP_ID()              G_ID
  FROM salary
 WHERE SMONTH BETWEEN '01' AND '12'
 GROUP BY CUBE(DEPT, NAME)   --GROUP BY ROLLUP(DEPT, NAME) 
 ORDER BY GROUPING(DEPT), DEPT, GROUPING(NAME), NAME ;

   DEPT    NAME     CNT    SALARY     G_DEPT  G_NAME  G_SUM  GING_ID  G_ID
 
-------------------------------------------------------------------------
   인사부   구하라    4    870000       0         0      0       0      0
   인사부   이주리    3    480000       0         0      0       0      0
   인사부   저미주    4    448000       0         0      0       0      0
   인사부            11   1798000       0         1      1       1      0
   총무부   강모리    3   1570000       0         0      0       0      0
   총무부   구하라    4    840000       0         0      0       0      0
   총무부   저미주    3    327000       0         0      0       0      0
   총무부            10   2737000       0         1      1       1      0
            강모리    3   1570000       1         0      1       2      0
            구하라    8   1710000       1         0      1       2      0
            이주리    3    480000       1         0      1       2      0
            저미주    7    775000       1         0      1       2      0
                     21   4535000       1         1      2       3      0

 

'(DB) Oracle > SQL.통계-단계별Study' 카테고리의 다른 글

Oracle - MODEL 1단계  (0) 2017.01.21
Oracle - OVER 1단계  (0) 2017.01.21
Oracle - ROUPING() 2 단계  (0) 2017.01.21
Oracle - GROUPING() 1 단계  (0) 2017.01.21
Oracel - CUBE 1 단계  (0) 2017.01.21
Posted by 농부지기
,