rollup 0 17 782

by 킨지 [SQL Query] [2019.03.05 13:56:35]


a  기탁  중앙관 중앙관  123 83.7%

a  기탁  중앙관  소계    123 83.7%

a  기탁  연구    like      12  8.2%

a  기탁  연구    unlike   12  8.2%

a  기탁  연구   소계      24  16.4

            합계              147  100%

 

이렇게 나오고 싶은데요 소계 합계는 구했으나 평균이...하 너무 힘드네요..

 

 

 

 

 

 

 

by 마농 [2019.03.05 14:44:28]

평균을 구하고자 하는 것 맞나요?
혹시 평균이 아니라 비율 말하는거 아닌가요?


by 킨지 [2019.03.05 14:46:17]

네 비율입니다 ㅠㅠ


by 킨지 [2019.03.05 15:56:17]

너무감사합니다..ㅠㅠㅠㅠㅠ 


by 마농 [2019.03.05 14:50:13]

롤업은 맞게 쓴건가요?
위에 제시한 결과보다 중간 소계(a, 기탁, 소계)가 더 나올 듯 한데요?


by 마농 [2019.03.05 15:12:57]
SELECT c.up_org_cd
     , (SELECT cm_cd_nm
          FROM cm_cd_info x
         WHERE 1=1
           AND x.cm_cd = c.up_org_cd
           AND cm_cls_cd = 'P0029'
        ) AS up_org_nm
     , NVL(c.org_nm    , '합계') org_nm
     , NVL(c.aff_org_nm, '소계') aff_org_nm
     , SUM(a.cnt) AS cnt
     , ROUND(RATIO_TO_REPORT(SUM(a.cnt)) OVER(PARTITION BY GROUPING_ID(c.org_nm, c.aff_org_nm)) * 100, 1) rat
  FROM (SELECT resorce_dist_no
             , COUNT(*) AS cnt
          FROM pt_log_info
         WHERE 1=1
           AND resorce_dist_no IS NOT NULL
         GROUP BY resorce_dist_no
        ) a
     , rs_bio_resorce_cm_info b
     , cm_org_info c
 WHERE 1=1
   AND a.resorce_dist_no = b.resorce_dist_no
   AND b.aff_org_cd = c.aff_org_cd
   AND c.up_org_cd = 'A'
 GROUP BY ROLLUP ((c.up_org_cd, c.org_nm), c.aff_org_nm)
 ORDER BY c.up_org_cd, c.org_nm, c.aff_org_nm
;
SELECT c.up_org_cd
     , x.cm_cd_nm AS up_org_nm
     , NVL(c.org_nm    , '합계') org_nm
     , DECODE(GROUPING_ID(c.org_nm, c.aff_org_nm), 1, '소계', c.aff_org_nm) aff_org_nm
     , COUNT(*) AS cnt
     , ROUND(RATIO_TO_REPORT(COUNT(*)) OVER(PARTITION BY GROUPING_ID(c.org_nm, c.aff_org_nm)) * 100, 1) rat
  FROM pt_log_info a
     , rs_bio_resorce_cm_info b
     , cm_org_info c
     , cm_cd_info x
 WHERE 1=1
   AND a.resorce_dist_no IS NOT NULL
   AND a.resorce_dist_no = b.resorce_dist_no
   AND b.aff_org_cd = c.aff_org_cd
   AND c.up_org_cd = 'A'
   AND x.cm_cd = c.up_org_cd
   AND x.cm_cls_cd = 'P0029'
 GROUP BY c.up_org_cd, x.cm_cd_nm, ROLLUP (c.org_nm, c.aff_org_nm)
 ORDER BY c.org_nm, c.aff_org_nm
;

 


by 킨지 [2019.03.06 11:04:27]

질문이 하나 더있는데요 소계비율(rat) 은 비율에 대한 합이 아닌가요? 소계 대비 비율이 나온거 같아서용.. 질문드립니다.


by 마농 [2019.03.06 13:11:39]

비율의 합이 아니라
각각의 기준으로 비율을 구한 것입니다.
소계는 소계끼리의 비율.


by 킨지 [2019.03.06 13:19:54]

아아 혹시 각각의 기준을 소계에 합처럼 나올수 있게 할수있나요? avg의 합

왜냐면..

반올림을 해서 소계 avg합은 8인데 소계에대한 비율로 7이 나오거든요.. 이게 참 애매하긴한데..

혹시 어느쪽을 손봐야 하나요//?

 

 


by 마농 [2019.03.06 13:29:25]

그런식으로 하면 최종 합계가 100 % 가 안나올텐데요?
이대로 두시는 걸 추천하고 싶네요.
소수점 자리수를 늘리던가요.


by 킨지 [2019.03.06 13:44:52]

네 맞습니다... 근데 마지막 비율의 합은 100%가 안나와도  jsp에서 지울꺼라 ...혹시 어느쪽을 봐야할까요? 


by 마농 [2019.03.06 14:07:14]

마지막 합계 라인이 아예 필요 없는 건가요?
아니면 jsp 에서 100 % 로 조정하겠다는 건가요?


by 킨지 [2019.03.06 14:24:12]

라인은필요합니다. 네 JSP에서 100%으로 조정하거나 지울예정입니다.


by 마농 [2019.03.06 14:31:36]

그룹바이를 2 단계로 나누어 하세요.
 - 1 단계 : 집계 및 비율 구하고
 - 2 단계 : 롤업 합산 처리
 

SELECT up_org_cd
     , up_org_nm
     , NVL(org_nm, '합계') org_nm
     , DECODE(GROUPING_ID(org_nm, aff_org_nm), 1, '소계', aff_org_nm) aff_org_nm
     , SUM(cnt) cnt
     , DECODE(GROUPING_ID(org_nm, aff_org_nm), 3, 100, SUM(rat)) rat
  FROM (SELECT c.up_org_cd
             , x.cm_cd_nm AS up_org_nm
             , c.org_nm
             , c.aff_org_nm
             , COUNT(*) AS cnt
             , ROUND(RATIO_TO_REPORT(COUNT(*)) OVER() * 100, 1) rat
          FROM pt_log_info a
             , rs_bio_resorce_cm_info b
             , cm_org_info c
             , cm_cd_info x
         WHERE 1=1
           AND a.resorce_dist_no IS NOT NULL
           AND a.resorce_dist_no = b.resorce_dist_no
           AND b.aff_org_cd = c.aff_org_cd
           AND c.up_org_cd = 'A'
           AND x.cm_cd = c.up_org_cd
           AND x.cm_cls_cd = 'P0029'
         GROUP BY c.up_org_cd, x.cm_cd_nm, c.org_nm, c.aff_org_nm
        ) a
 GROUP BY up_org_cd, up_org_nm, ROLLUP(org_nm, aff_org_nm)
 ORDER BY a.org_nm, a.aff_org_nm
;

 


by 킨지 [2019.03.06 14:37:37]

ㅠㅠㅠ... 이런 안목을 키우려면 어떤방식으로 공부를 해야되나요? 와 너무 감사하네요..


by 킨지 [2019.03.06 15:23:47]

추가로 질문하나 있습니다.

소계와 합계를 뺀 ROW의 카운트가 필요해서 SELECT절에 한줄을 추가했습니다. 

 

,COUNT(*) OVER() - COUNT(*) OVER(PARTITION BY C.AFF_ORG_NM) CT

마지막 합계 행에 나오긴나옵니다. PARTITION BY라는게 그룹을 묶는걸로 알고있는데 소계랑 같이 있다보니 

이해가 잘 안가네요.. 


by 마농 [2019.03.06 16:07:39]

추가 질문을 쿼리 일부만 올리셨네요?
  - 1단계에 추가한 건지? 2단계에 추가한건지?
  - c. 을 사용한 걸 보면 1단계인 듯 한데...
1단계에서 사용한다면?
  - 단순 COUNT(*) OVER() ct 하면 되구요.
  - 대신 2단계 그룹바이 기준에 ct 를 추가해야 함.
2단계에서 사용한다면?
  - aff_org_nm 의 수를 세면 됩니다.
  - COUNT(aff_org_nm) OVER() ct


by 킨지 [2019.03.06 16:48:51]

죄송합니다. 한줄밖에 추가를 안해서..하하 다음에는 전체 쿼리를 올리겠습니다.

COUNT(aff_org_nm) OVER() ct 이걸쓰니까 바로 카운트가 되네요.. 감사합니다.

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