중복처리에 대해서 질문입니다.. 0 11 1,201

by 지침 [2015.04.21 14:06:24]


빨간색 부분에 보면

commentType 칼럼에 값은 널,0,10,30 등등 값이 있습니다.

값이 없을때와 값이 하나만 있을때는 괜찮지만 

파란색부분 처럼 commentType이 여러값이 있을땐 중복되어서 나옵니다.

결과값으로는 파란색부분에 중복이 나오게되면 commentType이 30인것만 (2) 사진 처럼 나오록 하고싶습니다.

중복제거하는 기준이 필요할것같은데.. 어렵네요..

by 창조의날개 [2015.04.21 14:28:12]

데이터량이 많지 않다면 그냥 간단하게..


WITH TT AS(
  원본쿼리
)
SELECT *
FROM TT
WHERE (TRANSCODE, COMMENTTYPE) IN (
      SELECT TRANSCODE, MAX(COMMENTTYPE)
      FROM TT
      GROUP BY TRANSCODE)
;

 


by 지침 [2015.04.21 14:39:25]

답변감사합니다.commentType이 60,100도 있어서 MAX로 하면 안되지않을까요..?


by 개발뉴비 [2015.04.21 14:43:02]

중복 데이터가 있을경우 connentType의 값이 30만 나오게 하는건가요?


by 지침 [2015.04.21 14:46:31]

네맞습니다.

중복이 아닌값들은 그냥 그대로 출력이 되고

중복이라면 30 인것만 나오도록 하고싶습니다.

아... 그렇게 보면 방금생각난건데..

중복이라면 30이 없을 때도 있는데.. 그땐 그냥 아무것이나 중복제거를 하고싶습니다..


by 개발뉴비 [2015.04.21 14:52:36]
-- 중복데이터가 있을경우 connentType이 30값 고정 표시
-- 이럴경우 tc.commentType의 값에 30이 없을경우 표시가 안되는.....;;
AND (tc.transIdx, tc.connentType) IN (SELECT x.transIdx
                                           , CASE WHEN COUNT(x.idx) > 1 THEN 30
                                                  ELSE MAX(x.commentType)
                                             END
                                        FROM trams_comment x
                                       GROUP BY x.transIdx)

by 지침 [2015.04.21 14:55:37]

답변감사합니다.. ㅠㅠ

확인해보니 30이 있는 값만 출력이 되는군요.. ㅠㅠ


by 개발뉴비 [2015.04.21 14:42:07]
-- 창조의 날개님 빠르시네요...ㅎㅎ
AND (tc.transIdx, tc.connentType) IN (SELECT x.transIdx, MAX(x.commentType) FROM trams_comment x
                                       WHERE x.transIdx = tr.idx
                                       GROUP BY x.transIdx)

 


by 창조의날개 [2015.04.21 15:15:03]

데이터가 없어서 확인이 안되니.. 상상코딩...


WITH TT AS(
  원본쿼리 
)
SELECT TT.*
FROM TT
WHERE (TRANSCODE, COMMENTTYPE) IN (
      SELECT TRANSCODE, MAX(COMMENTTYPE)
      FROM (SELECT TT.TRANSCODE, DECODE(SS.VIEW_COMMENTTYPE,30,30,TT.COMMENTTYPE) COMMENTTYPE
            FROM TT LEFT OUTER JOIN 
                 (
                  SELECT TRANSCODE, COMMENTTYPE AS VIEW_COMMENTTYPE
                  FROM TT
                  WHERE COMMENTTYPE = 30
                  ) SS ON (TT.TRANSCODE = SS.TRANSCODE)
           )
      GROUP BY TRANSCODE)
;

 


by 개발뉴비 [2015.04.21 15:46:35]
-- 창조의 날개님 쿼리를 참고하여 조금 줄여봤습니다.
WHERE (tc.transIdx, tc.commentType) IN (
        SELECT transIdx, NVL( (SELECT 30 FROM trans_comment tc3
                                   WHERE tc3.transIdx = tc2.transIdx
                                     AND tc3.commentType = 30)
                          , MAX(tc2.commentType) )    
        FROM trans_comment tc2
        GROUP BY tc2.transIdx)

 


by DarkBee [2015.04.21 15:19:25]

단순 그룹바이 문제같습니다.


by 마농 [2015.04.21 16:34:14]
SELECT ...
  FROM (SELECT ...
             , ROW_NUMBER() OVER(PARTITION BY idx
               ORDER BY DECODE(commentType, 30, -1, commentType) ) rn
          FROM ...
         WHERE ...
        )
 WHERE rn = 1
;

 

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