중복제거?? 0 7 805

by 신의한수 [MySQL] [2020.01.01 21:45:20]


res1.png (3,615Bytes)
res2.png (4,370Bytes)

안녕하세요...

프로그램을 하나 작업하고 있는데요. 작업진행간 막히는 부분이 있어 조언을 구하고자합니다.
테이블 2개 (주문테이블, 주문상품테이블) 조인을 통해 결과값을 도출하고있습니다.

SELECT x.orderNum AS '주문번호'
     , x.deliveryPay AS '배송비'
FROM orderTbl AS x
LEFT JOIN ordproductTbl AS y 
  ON x.orderNum = y.orderNum
WHERE x.orderNum != ''
ORDER BY x.ordDate DESC

위 쿼리문을 실행하면 
아래처럼 결과값이 나오는데요

결과값을 보면
191231145109863 이라는 주문번호에 각각 배송비가 3000원이 부과되는걸로 쿼리문이 나옵니다.(원래는 191231145109863 주문번호가 3000원입니다)

제가 원하는 결과값은 191231145109863 주문번호 3개중에서 한개에만 3000원이 표시되고 나머지는 0 으로 표시되게 하고싶은데요
이렇게, 저렇게 방법을 동원해봐도 원하는 결과값이 나오지 않네요..
고수님들의 조언좀 부탁드립니다.

감사합니다.

 

by chrome [2020.01.02 15:23:19]

LEFT JOIN ordproductTbl AS y 

를 하신 이유는 무엇입니까?


by chrome [2020.01.02 15:32:53]

주문에 따른 상품이 여러개 이기 때문에 결국 join 시 여러개가 나오게 되서인듯 할텐데요.

주문상품테이블의 key 가 주문번호와 함께 주문 상품 번호이겠내요.

 

select 절에 주문상품번호가 1일 경우에만 ( 혹은 그에 준하는 pk정렬로 순서를 만들어서 ) 배송비를 표시하게 하는게 어떨까요.


by 마농 [2020.01.02 16:18:36]

분석함수(row_number 등.) 사용 가능 버전인지 확인하세요.
CASE WHEN ROW_NUMBER() OVER(PARTITION BY x.주문번호 ORDER BY y.주문상세번호) = 1 THEN x.배송비 ELSE 0 END


by 신의한수 [2020.01.02 17:34:03]

답변감사합니다. 분석함수를 사용할수있는 버전이 아닙니다.

해당DB는 MYSQL입니다. 

 

감사합니다.


by 마농 [2020.01.02 18:09:31]

MySQL 도 최신버전에서는 분석함수 됩니다.


by DarkBee [2020.01.02 17:53:16]
SELECT (CASE @grp WHEN a.주문번호 THEN @rownum:=@rownum+1 ELSE @rownum:=1 END) rnum
	 , a.주문번호
	 , CASE WHEN @rownum = 1 THEN a.배송비 ELSE 0 END 배송비
     , (@grp := y.주문번호)
  FROM (
          SELECT x.orderNum    AS 주문번호
               , x.deliveryPay AS 배송비
            FROM orderTbl AS x
            LEFT JOIN ordproductTbl AS y 
                   ON x.orderNum = y.orderNum
           WHERE x.orderNum != ''
           ORDER BY x.ordDate DESC --???
  ) a
, ( SELECT @rownum:=0, @grp:='' FROM dual ) b
;

 


by 도동22 [2020.01.07 10:11:11]
select orN as '주문번호', (case when rnum=1 then dP else 0 end) as '배송비'
from(
    SELECT x.orderNum as orN
         , x.deliveryPay AS dP, ROW_NUMBER() over (partition by x.orderNum order by x.ordDate desc) as rnum
    FROM orderTbl AS x
    LEFT JOIN ordproductTbl AS y 
      ON x.orderNum = y.orderNum
    WHERE x.orderNum != ''
) T

 

도움이 되시길 바랍니다.

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