group by rollup 관련 질문 0 5 2,347

by drakdragon [2014.03.11 09:46:18]


a    b     c    d 
1    a     y    100
1    a     n    200
1    b     n    100
1    b     y    200
2    a     n    200
2    a     n    300
2    b     y    100
2    b     y    200

이렇게 data 가 있을경우에

group by rollup 을 이용하여

전체 d컬럼  합, a컬럼별 d컬럼 합 , b 컬럼별 d컬럼 합을 구하고 싶습니다.

c컬럼은 상관없이 말이죠..  group by rollup 으로 하려고하는데 어떤식으로 해야할지요..ㅜㅜ




by 신이만든짝퉁 [2014.03.11 11:39:20]
with tmp as
(
    select 1 a, 'a' b, 'y' c, 100 d from dual union all
    select 1 a, 'a' b, 'n' c, 200 d from dual union all
    select 1 a, 'b' b, 'n' c, 100 d from dual union all
    select 1 a, 'b' b, 'y' c, 200 d from dual union all
    select 2 a, 'a' b, 'n' c, 200 d from dual union all
    select 2 a, 'a' b, 'n' c, 300 d from dual union all
    select 2 a, 'b' b, 'y' c, 100 d from dual union all
    select 2 a, 'b' b, 'y' c, 200 d from dual
)
select a, b, c, d_sum, ga, gb, gc, gd
  from (
        select a, b, c, sum(d) d_sum
             , grouping(a) ga
             , grouping(b) gb
             , grouping(c) gc
             , grouping(d) gd
          from tmp
         group by cube (a, b, c, d)
       )
 where (ga = 1 and gb = 1 and gc = 1 and gd = 1)
    or (ga = 0 and gb = 1 and gc = 1 and gd = 1)
    or (ga = 1 and gb = 0 and gc = 1 and gd = 1)
;

이게 도움이 될까요?

by drakdragon [2014.03.11 20:22:25]
rollup 으로 하는법이 궁금했지만

도움이 많이 되었습니다

감사합니다

by 마농 [2014.03.11 16:35:51]
SELECT a, b, c
     , SUM(d) d
  FROM t
 GROUP BY ROLLUP(a, (b, c))
;

by drakdragon [2014.03.11 20:22:51]
감사합니다 

rollup 안에 ()를 사용하는것을 간단하게 설명 부탁드려도될까요.ㅜㅜ

by 마농 [2014.03.12 09:19:16]
롤업은 단계별 소계를 구하는 함수이구요.
그룹바이 기준항목들을 오른쪽 항목(하위기준항목) 부터 차례로 지워나가면서 합산하는 개념입니다.
GROUP BY ROLLUP(a, b, c) 는 다음 4가지 기준으로 합산합니다.
1. GROUP BY a, b, c
2. GROUP BY a, b
3. GROUP BY a
4. GROUP BY Null
이때 c 는 그룹바이의 기준이 아닌 부가적인 정보일 뿐이라면
기준이 되는 항목과 함께 괄호로 묶어줍니다.
롤업에서 오른쪽 항목이 지워질때 (b 따로, c 따로)가 아니라 (b,c)가 함께 지워지는 것이죠.
GROUP BY ROLLUP(a, (b, c)) 는 다음 3가지 기준으로 합산합니다.
1. GROUP BY a, b, c
2. GROUP BY a
3. GROUP BY Null
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입