[답변]누적 관련 질문. 0 2 1,309

by 이주호 [2007.01.16 15:12:12]


아래 내용이 원하시는 결과인지 궁금하네요.

원본 데이터는 기 주신 데이터에 마지막 라인을 포함해서 사용했습니다.

즉,

select 'A' a, '200611' b, 100640 c, '서울' d,  0 e, 0 f, 0 g from dual union all
select 'A', '200611', 100641, '서울', 0, 20, 0 from dual union all
select 'A', '200611', 100642, '부산', 100, 0, 0 from dual union all
select 'A', '200610', 100639, '부산', 100, 100, 100 from dual
이렇게요... 

아래 쿼리 참고하시길...

 

select a.no
       ,a.a
       ,a.b
       ,a.c
       ,case when a.no=1 then a.d else 'TOT' end d
       ,sum(a.e) e
       ,sum(a.e_sum) e_sum
       ,sum(a.f) f
       ,sum(a.f_sum) f_sum
       ,sum(a.g) g
       ,sum(a.g_sum) g_sum
from (
        select case when a.no=1 then a.no else 2 end no
               ,a.a
               ,case when a.no=1 then a.b else null end b
               ,a.c
               ,case when a.no=1 then a.d else null end d
               ,case when a.no=1 or a.no=2 then a.e else 0 end e
               ,case when a.no=1 or a.no=3 then sum(a.e) over (partition by a.no order by a.c) else 0 end e_sum
               ,case when a.no=1 or a.no=2 then a.f else 0 end f
               ,case when a.no=1 or a.no=3 then sum(a.f) over (partition by a.no order by a.c) else 0 end f_sum
               ,case when a.no=1 or a.no=2 then a.g else 0 end g
               ,case when a.no=1 or a.no=3 then sum(a.g) over (partition by a.no order by a.c) else 0 end g_sum
        from (       
                select b.a no
                       ,case when b.a=1 then a.a else null end a
                       ,case when b.a=1 or b.a=2 then a.b else null end b
                       ,case when b.a=1 then a.c else null end c
                       ,case when b.a=1 then a.d when b.a=2 then 'sub_total' else 'TOT' end d
                       ,sum(a.e) e
                       ,sum(a.f) f
                       ,sum(a.g) g
                from (
                        select 'A' a, '200611' b, 100640 c, '서울' d,  0 e, 0 f, 0 g from dual union all
                        select 'A', '200611', 100641, '서울', 0, 20, 0 from dual union all
                        select 'A', '200611', 100642, '부산', 100, 0, 0 from dual union all
                        select 'A', '200610', 100639, '부산', 100, 100, 100 from dual
                     ) a,
                     (
                        select 1 a from dual union all
                        select 2 from dual union all
                        select 3 from dual
                     ) b  
                where a.a = 'A'
                and a.b between '200601' and '200611'
                group by b.a
                         ,case when b.a=1 then a.a else null end
                         ,case when b.a=1 or b.a=2 then a.b else null end
                         ,case when b.a=1 then a.c else null end
                         ,case when b.a=1 then a.d when b.a=2 then 'sub_total' else 'TOT' end
             ) a
        where a.b='200611'
        or a.b is null
     ) a
group by a.no
         ,a.a
         ,a.b
         ,a.c
         ,case when a.no=1 then a.d else 'TOT' end

by finecomp [2007.01.16 00:00:00]
음...질문자가 원하시는건 각 컬럼 누계같은데요...

누계는 8i이상이라면 분석함수로 하시면 간단합니다.(이하버전 방식은 여기강좌나 엔코아에서 검색하여 참고하시길...)

그리고 총계는 UNION ALL로 테이블을 두번 ACCESS 하지 마시고 ROLLUP으로 한번에 처리합니다.
group 조건은 CODE~SITE 라고 가정하고 위에도 중간소계는 빠져있으니 빼겠습니다.

SELECT
CASE WHEN datalevel = 1 THEN 'TOT' ELSE CODE END AS CODE
, YM, ID, SITE
, orig_cost
, CASE WHEN datalevel = 1 THEN orig_cost ELSE SUM(orig_cost) OVER(ORDER BY CODE, YM, ID, SITE) END AS "orig_누계"
, inc_cost
, CASE WHEN datalevel = 1 THEN inc_cost ELSE SUM(inc_cost) OVER(ORDER BY CODE, YM, ID, SITE) END AS "inc_누계"
, dec_cost
, CASE WHEN datalevel = 1 THEN dec_cost ELSE SUM(dec_cost) OVER(ORDER BY CODE, YM, ID, SITE) END AS "dec_누계"
FROM(
SELECT
GROUPING(CODE) as datalevel
, CODE, YM, ID, SITE
, SUM(orig_cost) as orig_cost
, SUM(inc_cost) as inc_cost
, SUM(dec_cost) as dec_cost
FROM TABLE
WHERE CODE = 'A'
AND YM = '2006-11'
GROUP BY ROLLUP(CODE, YM, ID, SITE)
HAVING GROUPING(CODE) = 1 OR GROUPING(SITE) = 0
)
ORDER BY datalevel, CODE, YM, ID, SITE

테스트 해 보시고 각 줄의 의문사항은 강좌등을 통해서 확인하시기 바랍니다.
도움이 되시길...

by 안희웅 [2007.01.17 00:00:00]
두 분다 엄청 감사합니다. ^^
아직 가르쳐준 소스가 다 머리에 들어오는건 아니지만, 공부해서 빨리 익힐께요 감사합니다. ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입