[답변] rollup의 활용 - grouping() 및 group_id() 사용 0 2 4,534

by 마농 rollup grouping group_id [2008.10.22 09:12:25]


WITH t AS
(
SELECT 1000 Oper, 'de1' Device, 'no1' No, 'n' Hold, 'y' Rework, 100 Qty FROM dual
UNION ALL SELECT 1000, 'de1', 'no2', 'y', 'n', 100 FROM dual
UNION ALL SELECT 1000, 'de1', 'no3', 'n', 'n', 100 FROM dual
UNION ALL SELECT 1000, 'de3', 'no4', 'y', 'y', 100 FROM dual
)
SELECT CASE WHEN grp = '11'
            THEN DECODE(gid,0,'TOTAL',1,'NOMAL',2,'REWORK',3,'HOLD')
            ELSE TO_CHAR(oper)
        END oper
     , CASE WHEN grp = '01'
            THEN DECODE(gid,0,'TOTAL',1,'NOMAL',2,'REWORK',3,'HOLD')
            ELSE device
        END device
     , CASE WHEN grp IN ('01','11')
            THEN TO_CHAR(DECODE(gid,0,cnt_t,1,cnt_n,2,cnt_r,3,cnt_h))
            ELSE no
        END no
     , hold
     , rework
     , DECODE(gid,0,sum_t,1,sum_n,2,sum_r,3,sum_h) qty
  FROM (SELECT oper
             , device
             , no
             , hold
             , rework
             , SUM(DECODE(hold,'y',qty)) sum_h
             , SUM(DECODE(rework,'y',qty)) sum_r
             , SUM(DECODE(hold||rework,'nn',qty)) sum_n
             , SUM(qty) sum_t
             , COUNT(DECODE(hold,'y',1)) cnt_h
             , COUNT(DECODE(rework,'y',1)) cnt_r
             , COUNT(DECODE(hold||rework,'nn',1)) cnt_n
             , COUNT(*) cnt_t
             , GROUP_ID() gid
             , GROUPING(device)||GROUPING(no) grp
          FROM t
         WHERE oper = 1000
         GROUP BY oper, ROLLUP(oper, oper, oper
                               , device, device, device, device
                               , (no, hold, rework)
                               )
         ORDER BY oper, device, no, gid DESC
        )
;

by 손님 [2008.10.22 15:59:50]
답변 감사드립니다...
비슷한 질문들이 많이 있는것은 알지만 그것들을 참고해도
해결이 잘 안되었거든요.. ^^

by 김강환 [2008.10.23 10:45:13]
이 문제 풀어 내느라 머리가 다 어질어질하는데 마농님 쿼리는 참 깔끔하게 나왔네요. 마농님은 이제 쿼리를 희롱하는 수준에 까지 다다르신듯...ㅎㅎ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입