쿼리 문의 드려요. 0 2 4,712

by 통쓰 [SQL Query] [2024.05.16 09:23:06]



아래와 같이 조회 했을 경우에 이미지에 같이 똑같은 데이터가 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;

 

 

 

 

by 마농 [2024.05.16 10:01:44]

1. 중복 확인
- 이미지 보시면 한 고객에 대해 fb_dt 가 두개가 있네요('2024-05-14' 와 NULL)
- 데이터에 오류는 없는지? 누락 된 조건은 없는지? 등을 확인해 보세요.
- 유니온 위 아래 조건이 다른데? 이부분 확인해 보세요. 조건이 같아야 하지 않을런지?
- Distinct 는 정상적인 상황에서는 대부분 사용하지 않는 구문입니다.
- 중복자료를 만든 뒤에 Distinct 하는 것이 아닌
- 애초에 중복이 나오지 않도록 조건을 주는 것이 맞습니다.
2. 기타 쿼리 개선
- 쿼리에 비효율이 있는데.
- c 에 대한 아우터 조인 후 where 절에서 c 조건 주는 것은
- 아우터 조인 하나마나 한 것으로 이너조인과 같습니다.
- 이너조인으로 바꾸세요.
- 그리고 합계를 별도 유니온으로 구하는데
- ROLLUP 을 이용해서 구해보세요.
- http://gurubee.net/oracle/advanced


by 통쓰 [2024.05.16 10:29:21]

마농님 감사합니다.. 조건이 위아래가 틀려서 그랬네요..말씀해주신대로!
쿼리  ROLLUP으로 개선해서 반영해보겠습니다!! 감사합니다.

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