Rollup과 rollup결과를 컬럼으로 옮기기 0 2 2,445

by 옹네 [2009.04.21 10:30:31]


코드 법기한 처리기한 처리건수 sub_sum 총법정처리기간 ONE_JISU 총단축지연기간 스피드지수
          법기한*sub_sum (법기한-처리기한)*처리건수 one_jisu합 총단축지연기간/총법정처리기간*100
A01 5 1 399 598 2990 1596 2057 68.79598662
A01 2 93 598 2990 279 2057 68.79598662
A01 3 79 598 2990 158 2057 68.79598662
A01 4 25 598 2990 25 2057 68.79598662
A01 5 1 598 2990 0 2057 68.79598662
A01 6 1 598 2990 -1 2057 68.79598662
A01합   598     2057    
A02 4 1 1029 1047 4188 4116 4170 99.57020057
A02 2 18 1047 4188 54 4170  
A02합   1047   0 4170    
A03 10 1 41 93 930 164 237  
A03 2 10 93 930 30 237  
A03 3 14 93 930 28 237  
A03 4 16 93 930 16 237  
A03 5 11 93 930 0 237  
A03 6 1 93 930 -1 237  
A03합   93   0 237 237  
총합     1738          

select minwon_cd, law_day, treat_day_gubun treat_day,  sum(treat_cnt) treat_cnt
        , DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,SUM(DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,sum(treat_cnt))) OVER(PARTITION BY a.minwon_cd),NULL) SUB_SUM
       ,(law_day * (DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,SUM(DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,sum(treat_cnt))) OVER(PARTITION BY a.minwon_cd),NULL)) ) total_law_treat_day
       ,((law_day-treat_day_gubun) * sum(treat_cnt) ) one_jisu
        , GROUPING_ID(a.minwon_cd, treat_day_gubun) grp
       , DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,COUNT(*) OVER(PARTITION BY a.minwon_cd)-1,NULL) LINE_CNT
from
    (
    select a.minwon_cd, a.treat_day, a.treat_cnt
          , CASE  WHEN a.treat_day-1 <= 1  THEN 1 
            else a.treat_day-1 
            END treat_day_gubun
          ,to_number(c.code_nm) law_day       
         
    from ongne_speed  a
      ,  swcum01_09 c
    where a.minwon_cd = c.code_id(+)
    and   c.group_cd(+) = '026'
    order by minwon_cd, treat_day
    ) A
group by law_day, rollup ( minwon_cd, treat_day_gubun )

 

안녕하세요. 여기에서 도움도 받고 검색도 해서 하양색 부분들까지는 위의 쿼리로 나오는데요..
색입힌 부분들을 구하고 싶어요... ㅠㅠ
1. 빨간부분 : one_jisu 의 sub_sum 과 이것을 옆에 컬럼으로 옮기기 (표의 최종 총단축지연기간)
2. 음... 1번이 해결이 되면 자동으로 스피드지수와 총단축지연기간은 계산할 수 있어요...

그리고 제가 짠 원천쿼리도 좀 봐주세요.. 어찌어찌 결과가 나오기는 했지만
코드별 처리건수부분합과 총합만 구하면 되는데 꼭 rollup을 rollup ( minwon_cd, treat_day_gubun ) 이렇게
두개로 묶어서 해야 하는지.. 코드로만 rollup하면 결과가 이상하게 나와요...

매번 너무 죄송합니다...

ㅠㅠ

 

 

by 서성우 [2009.04.21 10:50:38]
SELECT minwon_cd
,law_day
,treat_day_gubun
,treat_cnt
,sub_sum
,total_law_treat_day
,one_jisu
,Sum(Decode(treat_cnt,NULL,0,one_jisu)) over(PARTITION BY minwon_cd)
,grp
,line_cnt

FROM
(select minwon_cd, law_day, treat_day_gubun treat_day, sum(treat_cnt) treat_cnt
, DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,SUM(DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,sum(treat_cnt))) OVER(PARTITION BY a.minwon_cd),NULL) SUB_SUM
,(law_day * (DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,SUM(DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,sum(treat_cnt))) OVER(PARTITION BY a.minwon_cd),NULL)) ) total_law_treat_day
,((law_day-treat_day_gubun) * sum(treat_cnt) ) one_jisu
, GROUPING_ID(a.minwon_cd, treat_day_gubun) grp
, DECODE(GROUPING_ID(a.minwon_cd, treat_day_gubun),0,COUNT(*) OVER(PARTITION BY a.minwon_cd)-1,NULL) LINE_CNT
from
(
select a.minwon_cd, a.treat_day, a.treat_cnt
, CASE WHEN a.treat_day-1 <= 1 THEN 1
else a.treat_day-1
END treat_day_gubun
,to_number(c.code_nm) law_day

from ongne_speed a
, swcum01_09 c
where a.minwon_cd = c.code_id(+)
and c.group_cd(+) = '026'
order by minwon_cd, treat_day
) A
group by law_day, rollup ( minwon_cd, treat_day_gubun )
)

쿼리를 보기 쉽게 인라인으로 묶어서 표현했습니다.

컬럼을 옆으로 옮기는 것은
sum() over()와
decode를 이용하면 가능합니다

그리고 2번은 코드로만 롤업하면
treat_day_gubun은 그룹화 할수 없기 때문에
결과물이 나오지 않을 겁니다.

by 옹네 [2009.04.21 11:08:16]
와~~~
감사합니다~~!!!!!!!!

Thank you so much!!!!!!!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입