by 포병이짱이여 [SQL Query] Oracle SUM GROUP BY GROUPING SETS [2020.09.03 09:33:53]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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가 도출됩니다.
아무리 생각해도 왜 이렇게 나오는지 이유를 알 수 없어서 왜이렇게 나오는지 궁금합니다ㅠㅠ
버그가 아닐까요?
실행계획도 한번 확인해 보시고요.
쿼리가 복잡할수록 버그 가능성도 높아지니, 쿼리를 간결하게 바꿔보세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 ; |