SUM(), GROUP BY() 통계 질문드립니다. 0 6 4,081

by 포병이짱이여 [SQL Query] Oracle SUM GROUP BY GROUPING SETS [2020.09.03 09:33:53]


SELECT  RESER.PRDTR_ID
         , RESER.UNTACT         
         , COUNT(RESER.TR_RSRVT_ID) CNT
         , SUM(RESERD.RSRVT_QNTT) RSRVT_QNTT
         , SUM(RESERD.RSRVT_QNTT_M) RSRVT_QNTT_M
         , SUM(RESERD.RSRVT_QNTT_W) RSRVT_QNTT_W
         , SUM(RESERD.RSRVT_QNTT_11) RSRVT_QNTT_11
         , SUM(RESERD.RSRVT_QNTT_12) RSRVT_QNTT_12
         , SUM(RESERD.RSRVT_QNTT_13) RSRVT_QNTT_13
         , SUM(RESERD.RSRVT_QNTT_14) RSRVT_QNTT_14
         , SUM(RESERD.RSRVT_QNTT_15) RSRVT_QNTT_15
  FROM     TB_KNPS_TRAILRSRVT_M RESER
           , (	SELECT                                              
                           TR_RSRVT_ID   
                          , COUNT(TR_RSRVT_ID) CNT             
                          , SUM(DECODE(TR_RSRVT_TPECD, '01', TR_RSRVT_QNTT, 0)) RSRVT_QNTT 
                          , SUM(DECODE(TR_RSRVT_TPCD, '01', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_M
                          , SUM(DECODE(TR_RSRVT_TPCD, '02', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_W
                          , SUM(DECODE(TR_RSRVT_TPCD, '11', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_11
                          , SUM(DECODE(TR_RSRVT_TPCD, '12', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_12
                          , SUM(DECODE(TR_RSRVT_TPCD, '13', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_13
                          , SUM(DECODE(TR_RSRVT_TPCD, '14', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_14
                          , SUM(DECODE(TR_RSRVT_TPCD, '15', TR_RSRVT_QNTT , 0)) RSRVT_QNTT_15
                        FROM     TB_KNPS_TRAILRSRVT_D
           GROUP BY TR_RSRVT_ID  
                         ) RESERD
  WHERE    RESER.TR_RSRVT_ID     = RESERD.TR_RSRVT_ID
  AND      RESER.VLDTY_YN        = 'Y'
  AND      RESER.CNCLL_DTM IS NULL
  AND      RESER.TR_RSRVT_STCD   = 20
  AND      RESER.PRDTR_ID = 'PGB0110118'
  GROUP BY RESER.PRDTR_ID, RESER.UNTACT;

 

통계를 위해 위의 쿼리를 적용해보았는데

위의 쿼리를 SQL툴에서 처음 실행시

PRDTR_ID UNTACT CNT RSRVT_QNTT RSRVT_QNTT_M RSRVT_QNTT_W RSRVT_QNTT_11 RSRVT_QNTT_12 RSRVT_QNTT_13 RSRVT_QNTT_14 RSRVT_QNTT_15
PGB0110118 10 3523 5324 2352 235 2624 2342 2323 2421 522
PGB0110118 21 53 253 532 343 523 425 346 236 562
PGB0110118 20 13 242 523 573 465 236 464 236 642

이런식으로 3개의 ROW로 원하는 결과값이 도출됩니다.

그런데 이 상태에서 쿼리를 아무것도 변경하지않고(띄어쓰기 같은것도 그대로 놔두고) 쿼리를 한번 더 실행하면

PRDTR_ID UNTACT CNT RSRVT_QNTT RSRVT_QNTT_M RSRVT_QNTT_W RSRVT_QNTT_11 RSRVT_QNTT_12 RSRVT_QNTT_13 RSRVT_QNTT_14 RSRVT_QNTT_15
PGB0110118 10 3589 5819 3407 1151 3612 3003 3133 3893 1726

 

이런식으로.. UNTACT가 10이 나오고 이후 컬럼들이 처음실행 결과값에서 전부 SUM이 되어서 1개의 ROW만 도출됩니다..

웃긴건.. 위의 쿼리에서 띄어쓰기 같은걸 한다던지 등등.. 글자가 하나만 수정되어도 첫번째 결과처럼 3개의 ROW가 도출됩니다.

아무리 생각해도 왜 이렇게 나오는지 이유를 알 수 없어서 왜이렇게 나오는지 궁금합니다ㅠㅠ

by 마농 [2020.09.03 11:29:44]

버그가 아닐까요?
실행계획도 한번 확인해 보시고요.
쿼리가 복잡할수록 버그 가능성도 높아지니, 쿼리를 간결하게 바꿔보세요.
 

SELECT m.prdtr_id
     , m.untact
     , COUNT(DISTINCT m.tr_rsrvt_id) cnt
     , NVL(SUM(DECODE(d.tr_rsrvt_tpecd, '01', d.tr_rsrvt_qntt)), 0) rsrvt_qntt
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '01', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_m
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '02', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_w
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '11', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_11
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '12', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_12
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '13', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_13
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '14', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_14
     , NVL(SUM(DECODE(d.tr_rsrvt_tpcd , '15', d.tr_rsrvt_qntt)), 0) rsrvt_qntt_15
  FROM tb_knps_trailrsrvt_m m
     , tb_knps_trailrsrvt_d d
 WHERE m.tr_rsrvt_id   = d.tr_rsrvt_id
   AND m.vldty_yn      = 'Y'
   AND m.cncll_dtm IS NULL
   AND m.tr_rsrvt_stcd = 20
   AND m.prdtr_id      = 'PGB0110118'
 GROUP BY m.prdtr_id, m.untact
;

 


by 포병이짱이여 [2020.09.03 15:49:52]

답변 감사합니다~!

버그일 가능성이 큰거군요ㅠㅠㅠ

실행계획도 확인해보고 연구를 해봐야겠어요.

아래 쿼리도 grouping sets 썼을때보다 훨씬 빠르네요 ㅎㅎ 감사합니다~


by 마농 [2020.09.03 16:34:37]

grouping sets 는 뭔가요? 질문의 원본 쿼리에도 없던건데요?


by 포병이짱이여 [2020.09.03 18:06:59]

앗 죄송합니다. 본문에 첨부를 안해뒀었네요 ㅎㅎ;;

질문 원본 쿼리에 group by grouping sets((RESER.PRDTR_ID, RESER.UNTACT))

이렇게 해보니 결과값이 3개row로 잘 나오긴 하는데 시간이 엄청 오래 걸리더라구요..

그래서 고민했었는데 마농님이 작성하신 쿼리가 훨씬 빨라서 말씀드린거에요^^


by 마농 [2020.09.03 18:46:38]

GROUP BY GROUPING SETS((reser.prdtr_id, reser.untact)) <-- 이 구문은
GROUP BY reser.prdtr_id, reser.untact <-- 이 구문과 의미상 동일합니다.
GROUPING SETS 는 불필요하게 사용된 코드입니다.
그리고 GROUPING SETS 때문에 빨라진게 아니라
인라인뷰를 없애서 빨라진 것입니다.


by 포병이짱이여 [2020.09.04 13:24:06]

아하 ㅎㅎ 굳이 안써도 되는 구문이였군요..

공부를 좀 더 해야겠네요ㅠㅠ 도움 감사합니다~!

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