아래와 같이 조회 했을 경우에 이미지에 같이 똑같은 데이터가 2개씩 보이는데, FB_DT를 지우면 없어집니다... 무슨 문제일가요..?ㅠㅠ SELECT DISTINCT DECODE(FX_CODE_NM('COMM', 'CM0110', A.RWD_TP), 'Unknown Code', '비용구분없음', FX_CODE_NM('COMM', 'CM0110', A.RWD_TP)) AS RWD_NM , '0' SORT_CD , A.RWD_TP , TO_CHAR(B.FB_DT, 'yyyy-mm-dd') AS FB_DT , C.CCM_DT , A.SEQ , A.CCM_NO , C.CUST_NM , FX_CODE_NM ( 'USER', (SELECT COMP_CD FROM LM_USER WHERE USER_ID = C.RECV_ID AND USE_YN = 'Y') , C.RECV_ID) AS RECV_NM , A.RWD_AMT , DECODE(FX_CODE_NM('COMM', 'BC0640', C.COMP_CD), 'Unknown Code', '', FX_CODE_NM('COMM', 'BC0640', C.COMP_CD)) AS COMP_NM , (SELECT Y.HIER_NM FROM BC_ITEM X , BC_HIERARCHY Y WHERE SUBSTR(X.HIRCHY_CD, 0, 8) = Y.HIER_CD AND X.COMP_CD = Y.COMP_CD AND X.ITEM_CD = C.ITEM_CD AND X.COMP_CD = C.COMP_CD AND Y.HIER_TP = 'ITEM') AS HIER_NM , A.ITEM_CD , A.ITEM_NM , TO_NUMBER(NVL(REGEXP_REPLACE(A.ITEM_QTY, '[^0-9]'), 0)) AS ITEM_QTY , DECODE(A.SEND_YN , 'Y', '발송', '미발송') AS SEND_YN FROM CM_CCM_FB_RWD A LEFT JOIN CM_CCM_FB B ON A.CCM_NO = B.CCM_NO AND B.FB_TP='RWD' LEFT JOIN CM_CCM C ON A.CCM_NO = C.CCM_NO AND C.USE_YN = 'Y' WHERE C.CCM_DT BETWEEN '20240514' AND '20240516' AND SEND_YN = 'Y' UNION ALL SELECT '총계' AS RWD_NM , '1' AS SORD_CD , '' AS RWD_TP , '' AS FB_DT , '' AS CCM_DT , '' AS SEQ , '' AS CCM_NO , '' AS CUST_NM , '' AS RECV_N , SUM(A.RWD_AMT) AS RWD_AMT , '' AS COMP_NM , '' AS HIER_NM , '' AS ITEM_CD , '' AS ITEM_NM , SUM(TO_NUMBER(NVL(REGEXP_REPLACE(A.ITEM_QTY, '[^0-9]'), 0))) AS ITEM_QTY , '' AS SEND_YN FROM CM_CCM_FB_RWD A LEFT JOIN CM_CCM_FB B ON A.CCM_NO = B.CCM_NO AND A.SEQ_NO = B.SEQ_NO LEFT JOIN CM_CCM C ON A.CCM_NO = C.CCM_NO AND C.USE_YN = 'Y' WHERE C.CCM_DT BETWEEN '20240514' AND '20240516' AND SEND_YN = 'Y' ORDER BY SORT_CD , RWD_TP , FB_DT;
1. 중복 확인
- 이미지 보시면 한 고객에 대해 fb_dt 가 두개가 있네요('2024-05-14' 와 NULL)
- 데이터에 오류는 없는지? 누락 된 조건은 없는지? 등을 확인해 보세요.
- 유니온 위 아래 조건이 다른데? 이부분 확인해 보세요. 조건이 같아야 하지 않을런지?
- Distinct 는 정상적인 상황에서는 대부분 사용하지 않는 구문입니다.
- 중복자료를 만든 뒤에 Distinct 하는 것이 아닌
- 애초에 중복이 나오지 않도록 조건을 주는 것이 맞습니다.
2. 기타 쿼리 개선
- 쿼리에 비효율이 있는데.
- c 에 대한 아우터 조인 후 where 절에서 c 조건 주는 것은
- 아우터 조인 하나마나 한 것으로 이너조인과 같습니다.
- 이너조인으로 바꾸세요.
- 그리고 합계를 별도 유니온으로 구하는데
- ROLLUP 을 이용해서 구해보세요.
- http://gurubee.net/oracle/advanced