[답변] rollup, group_id(), grouping 이용 1 2 4,601

by 마농 rollup group_id grouping [2008.09.29 13:45:16]


WITH test_tab AS
(
SELECT 'DE_1' device, 'NO1' no, 10 qty, 'Y' hold, 'N' rework FROM dual
UNION ALL SELECT 'DE_1', 'NO2', 15, 'N', 'Y' FROM dual
UNION ALL SELECT 'DE_1', 'NO3', 10, 'N', 'N' FROM dual
UNION ALL SELECT 'DE_2', 'NO4', 10, 'Y', 'N' FROM dual
UNION ALL SELECT 'DE_2', 'NO5', 20, 'Y', 'N' FROM dual
UNION ALL SELECT 'DE_2', 'NO6', 25, 'N', 'N' FROM dual
UNION ALL SELECT 'DE_2', 'NO7', 15, 'N', 'N' FROM dual
)
SELECT CASE WHEN GROUP_ID() = 0 AND GROUPING(no) = 0 THEN device
            WHEN GROUP_ID() = 0 AND GROUPING(no) = 1 THEN 'TOTAL'
            ELSE 'NORMAL'
        END device
     , CASE WHEN GROUP_ID() = 0 AND GROUPING(no) = 0 THEN no
            WHEN GROUP_ID() = 0 AND GROUPING(no) = 1 THEN TO_CHAR(COUNT(*))
            ELSE TO_CHAR(COUNT(DECODE(hold||rework,'NN',1)))
        END no
     , CASE WHEN GROUP_ID() = 0 THEN SUM(qty)
            ELSE SUM(DECODE(hold||rework,'NN',qty))
        END qty
     , CASE WHEN GROUP_ID() = 0 AND GROUPING(no) = 0 THEN MIN(hold)
            WHEN GROUP_ID() = 0 AND GROUPING(no) = 1
            THEN COUNT(DECODE(hold,'Y',1))||'/'||SUM(DECODE(hold,'Y',qty))
        END hold
     , CASE WHEN GROUP_ID() = 0 AND GROUPING(no) = 0 THEN MIN(rework)
            WHEN GROUP_ID() = 0 AND GROUPING(no) = 1
            THEN COUNT(DECODE(rework,'Y',1))||'/'||SUM(DECODE(rework,'Y',qty))
        END rework
  FROM test_tab t
 GROUP BY device, ROLLUP(device, no)
 ORDER BY t.device, t.no, GROUP_ID()

by 손님 [2008.09.29 14:12:45]
마농님 정말 감사합니다...
아무리 고민을 해도 해결이 안되던데
님이 올려주신 소스를 참조하면 해결이 될꺼 같습니다...^^

by 김강환 [2008.09.30 14:40:34]
아..이해하기도 힘드네. 이해하기도 힘든거 술술 짜는 사람은 ?o미?
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입