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가 도출됩니다.
아무리 생각해도 왜 이렇게 나오는지 이유를 알 수 없어서 왜이렇게 나오는지 궁금합니다ㅠㅠ
버그가 아닐까요?
실행계획도 한번 확인해 보시고요.
쿼리가 복잡할수록 버그 가능성도 높아지니, 쿼리를 간결하게 바꿔보세요.
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 ;