database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39325 게시물 읽기
No. 39325
ROLLUP 관련 질문입니다.
작성자
권정현
작성일
2012-03-05 11:24
조회수
5,615

안녕하세요.

매번 글읽으면서 많은 도움을 받고 있습니다. 오늘은 안풀리는 문제가 있어서 도움을 청합니다. ^^

ROLLUP을 이용해서 소계, 합계를 구한 쿼리를 작성중입니다.

근데, 일반적으로 소계, 합계를 구하는건 상관이 없는데,

일부 값만 소계를 나눠어 소계합계를 구해야됩니다.

예를 들어

WITH TEMP AS
(
SELECT '서울' CENTER, '개발1팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '서울' CENTER, '개발1팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '서울' CENTER, '개발2팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '제주' CENTER, '개발1팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '제주' CENTER, '개발1팀' TEAM, 1300 AMT FROM DUAL UNION ALL
SELECT '제주' CENTER, '개발2팀' TEAM, 1500 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '개발1팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '개발2팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '개발2팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '개발2팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '업무1팀' TEAM, 1000 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '업무2팀' TEAM, 1300 AMT FROM DUAL UNION ALL
SELECT '대전' CENTER, '업무2팀' TEAM, 1400 AMT FROM DUAL

)
SELECT DECODE(GROUPING(CENTER), 0, CENTER, '합계') CENTER
      ,DECODE(GROUPING_ID(CENTER,TEAM),0,TEAM,1,'소계','') TEAM
      ,SUM(AMT) FROM TEMP
GROUP BY ROLLUP(CENTER, TEAM);


 

이렇게 했을때  결과는 다음과 같습니다.

대전 개발1팀 1000
대전 개발2팀 3000
대전 업무1팀 1000
대전 업무2팀 2700
대전 소계 7700
서울 개발1팀 2000
서울 개발2팀 1000
서울 소계 3000
제주 개발1팀 2300
제주 개발2팀 1500
제주 소계 3800
합계   14500

 이결과를 아래와 같이 대전만 팀별로 소계를 더 내고 싶습니다.

어떻게 해야될까요.  고수님들 도와주세요~

 

대전 개발1팀 1000
대전 개발2팀 3000
대전 개발팀소계 4000
대전 업무1팀 1000
대전 업무2팀 2700
대전 업무팀소계 3700
대전 팀소계 7700
서울 개발1팀 2000
서울 개발2팀 1000
서울 소계 3000
제주 개발1팀 2300
제주 개발2팀 1500
제주 소계 3800
합계   14500

이 글에 대한 댓글이 총 3건 있습니다.

SELECT NVL(center, '합계') center
     , DECODE(GROUPING_ID(center, team)
     , 0, team
     , 1, DECODE(center, '대전', gb||'팀')||'소계'
     ) team
     , SUM(amt) amt
  FROM (
        SELECT center
             , DECODE(center, '대전', SUBSTR(team, 1, 2)) gb
             , team
             , amt
          FROM temp
        )
 GROUP BY ROLLUP(center, gb, team)
HAVING center = '대전'
    OR GROUPING_ID(center, gb) != 1
;

마농(manon94)님이 2012-03-06 19:40에 작성한 댓글입니다.

SELECT  NVL(CENTER,'합계') CENTER,
        TEAM||DECODE(GROUPING_ID(CENTER,TEAM,TEAM_DTL),0,TEAM_DTL,7,'',DECODE(MAX(CNT),1,'소계','팀소계')) TEAM,
        SUM(AMT) AMT
FROM (
SELECT  CENTER,
        REPLACE(TEAM,REGEXP_SUBSTR(TEAM,'[[:digit:]]{1,}팀',1,1)) TEAM,
        REGEXP_SUBSTR(TEAM,'[[:digit:]]{1,}팀',1,1) TEAM_DTL,
        AMT,
        COUNT(DISTINCT REPLACE(TEAM,REGEXP_SUBSTR(TEAM,'[[:digit:]]{1,}팀',1,1))) OVER (PARTITION BY CENTER) CNT
FROM TEMP
)
GROUP BY GROUPING SETS
    (
     (CENTER,TEAM,TEAM_DTL),
     (CENTER,TEAM),
     (CENTER),
     ()
    )  
HAVING MAX(CNT) != 1
OR GROUPING_ID(TEAM,TEAM_DTL) != 1

AAAA님이 2012-03-15 13:11에 작성한 댓글입니다. Edit

마농님, AAAA님 답글 감사드립니다.

고민많이 했었는데 HAVING을 이용할 생각을 못했네요.

답글보면서 공부많이 해야겠다는 생각을 해봅니다.

다시한번 감사드리며 즐거운 주말보내시길 바랍니다.~

권정현님이 2012-03-16 09:58에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39328Data Pump 옵션 좀 알려주세요. [1]
빈&서
2012-03-05
3966
39327서브쿼리로 하려고 하는데 어떻게 해야할지 [2]
왕태봉
2012-03-05
4281
39326ProC 에서 Procedure 호출 방법
나재호
2012-03-05
3640
39325ROLLUP 관련 질문입니다. [3]
권정현
2012-03-05
5615
39324월간 주차 구하는 쿼리 문의 [1]
이문정
2012-03-02
5353
39323EXECUTE IMMEDIATE의 V_SQL 타입 변경 [1]
전형근
2012-03-02
3799
39322where절의 in 조건을 파라메터에 따라 부여할수 있을까요?? [2]
곰두리
2012-03-02
4174
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다