부분합에 대해서 질문합니다. 0 3 1,946

by 제일 [PL/SQL] [2013.04.08 16:04:43]


쿼리.png (12,099Bytes)

다음과 같은 쿼리를 돌리면

SELECT B.R
     , A.DIAG_SCLS_CD
     , A.PT_CNT
     , DECODE(CTH_CNT, 1, A.PT_CNT) ONE
     , A.CTH_CNT || '회' CTH_CNT
     , A.SUM_MED_COST
     , A.SUM_EXMN_COST
     , DECODE(PT_CNT, 0, 0, (SUM_MED_COST / PT_CNT)) AVG_MED_COST
     , DECODE(PT_CNT, 0, 0, (SUM_EXMN_COST / PT_CNT)) AVG_EXMN_COST
  FROM PT_INFO      A
     , TOP10        B
 WHERE A.DIAG_SCLS_CD = B.DIAG_SCLS_CD 
   AND R <= 10
 ORDER BY R NULLS FIRST , PT_CNT DESC

다음과 같은 결과값이 나옵니다. 그런데 여기서 제가 궁금한점은
각 Row Data가 현재 DIAG_SCLS_CD별, CTH_CNT별의 값으로 카운트값이 뿌려지는데
여기서 DIAG_SCLS_CD별로만 부분합을 구하고 싶습니다.
즉 PT_CNT와 TOT_CNT의 값이 같은것이 아니라 각 R별 PT_CNT의 SUM값을 구하고 싶은데...
뒤에 삭제되어 있는 내용이긴하지만 사실 각 코드별 카운트별 금액의 합이 구해져 있습니다.

문제는 단순히 GROUP BY를 하는데 과연 이 SUM값까지 GROUP BY로 두는것이 아닌것 같아서
조금더 가독성이 좋은 방법이 없을까 하여 질문을 하게 되었습니다.
by 제일 [2013.04.08 16:12:20]
TOT_CNT에
(SELECT SUM(PT_CNT) FROM PT_INFO P WHERE P.DIAG_SCLS_CD = A.DIAG_SCLS_CD) TOT CNT
와 같은 서브 쿼리도 생각해보았으나 이러면 PT_INFO를 두번 FULL스캔 하는 문제 때문에 다른 방법이 있을까 하여 질문하였습니다. ㅠ.ㅠ

by 마농 [2013.04.08 16:30:46]
-- Analytic Function 을 이용하세요. --
, SUM(a.pt_cnt) OVER(PARTITION BY b.r) tot_cnt
, SUM(a.pt_cnt) OVER(PARTITION BY a.diag_scls_cd) tot_cnt

by 제일 [2013.04.08 16:36:12]
완전감사합니다. 완벽하게 해결되었어요 ㅠ^ㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입