집계 쿼리 좀 여쭤봅니다. 0 2 1,275

by 이상훈84 [SQL Query] [2013.12.19 19:13:48]



오라클 책 보면서 공부하고 있는데,

책에 있는 예제로는 어떤 식으로 그룹핑 함수들의 활용할지 잘 감이 안 오네요.

예를 들어서

DEPT_ID || SALARY || BONUS
AA5A     300   100 
AA5A     400   150
AA5B     350    200
AA5B    100    400

이런 식의 데이터가 있고

DEPT_ID 는 각 자리가 계층형으로 부서를 나타낸다고 가정할 때
(첫 자리는 회사전체, 둘째 자리는 사업부, 세째 자리는 과, 네째 자리는 반)

위의 데이터를 아래 처럼 집계하려면 어떤 그룹핑 함수를 써야 하는건가요?

분류   ||  DEPT_ID  || SALATY || BONUS
반 AA5A     700    250
반 AA5B  450     600
과       AA5 1150 850 
사업부    AA    1150 850
전체    1150      850
   
답글 달아주실 고수님들께 미리 감사드립니다 *^^*
by 마농 [2013.12.20 08:27:43]
WITH t AS
(
SELECT 'AA5A' dept_id, 300 salary, 100 bonus FROM dual
UNION ALL SELECT 'AA5A', 400, 150 FROM dual
UNION ALL SELECT 'AA5B', 350, 200 FROM dual
UNION ALL SELECT 'AA5B', 100, 400 FROM dual
)
SELECT DECODE('', d2, '회사', d3, '사업부', d4, '과', '반') 분류
     , COALESCE(d4, d3, d2, d1) dept_id
     , SUM(salary) salary
     , SUM(bonus) bonus
  FROM (SELECT SUBSTR(dept_id, 1, 1) d1
             , SUBSTR(dept_id, 1, 2) d2
             , SUBSTR(dept_id, 1, 3) d3
             , dept_id d4
             , salary
             , bonus
          FROM t
        )
 GROUP BY d1, ROLLUP(d2, d3, d4)
;

by 우리집아찌 [2013.12.20 09:30:59]
WITH T1 AS ( 
SELECT 'AA5A' DEPT_ID, 300 SALARY, 100 BONUS FROM DUAL UNION ALL 
SELECT 'AA5A', 400, 150 FROM DUAL UNION ALL
SELECT 'AA5B', 350, 200 FROM DUAL UNION ALL
SELECT 'AA5B', 100, 400 FROM DUAL 
) , T2 AS (
(SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 4 ) 
)

SELECT DECODE(LV,4,'반',3,'과','2','사업부',1,'전체','') "분류" , 
    SUBSTR(DEPT_ID,1,LV ) DEPT_ID , SUM(SALARY)SALARY , SUM(BONUS) BONUS , LV
 FROM T1 , T2 
 GROUP BY SUBSTR(DEPT_ID,1,LV ) , LV 
 ORDER BY LV DESC
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입