아래와 같이 조회 했을 경우에 이미지에 같이 똑같은 데이터가 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
마농님 감사합니다.. 조건이 위아래가 틀려서 그랬네요..말씀해주신대로!
쿼리 ROLLUP으로 개선해서 반영해보겠습니다!! 감사합니다.