중복제거를 하고 싶습니다. 0 18 1,309

by alues [2014.04.21 11:28:18]


table_1   table_2
회사구분(pk)   회사구분(pk)
판매번호(pk)   거래처(pk)
거래처   거래처2(pk)
수량    
금액    

 

table_1        
회사 판매 거래처 수량 금액
1111 1001 99 10 1000
1111 1002 88 20 2000
1111 1003 77 30 3000

 

table_2    
회사 거래처 거래처2
1111 99 99
1111 88 88
1111 66 66

 

결과값
회사 거래처 수량 금액 함수사용(회사,거래처,일자<-아규먼트)
1111 99 10 1000 300
1111 88 20 2000 200
1111 77 30 3000 100
1111 66 0 0 500

 

이런식인데요. 일자는 우선 안 넣었고요. 저런식으로 값을 뽑고 싶은데 잘 안되네요.

table_1에서는 수량 금액 이런부분을 가져오는거고요. 함수도 사용하고요.

table_2에서는 수량 금액을 제외하고 가져와야 하는거고요.

두개의 테이블에 동일한 값이 들어가있으니 동일하게 함수를 써버려서 합쳐지게 되면 2배의 값이 나와버리고요..

다른값이 들어있는 경우는 그냥 그대로 뽑으면 되는데 동일한 값이 있을때가 문제네요

동일한 값 기준은 거래처 기준이고요.

by 농부지기 [2014.04.21 11:46:34]

2가지 방법이 있어요.

첫번째는 FULL OUTER JOIN과

두번재는 UNION 방법..

둘중 원하시는 방법을 선택 하면 될거 같네요.

--첫 번째 방법
SELECT A.*, B.*
  FROM table_1 A FULL JOIN table_2 B
         ON (CODE=CODE) ;

--두 번째 방법 
SELECT A.*, B.*
  FROM table_1 A INNER JOIN table_2 B
         ON (CODE=CODE) 
UNION ALL
SELECT A.*, B.*
  FROM table_1 A LEFT OUTER JOIN table_2 B
         ON (CODE=CODE) 
UNION ALL
SELECT A.*, B.*
  FROM table_1 A RIGHT OUTER JOIN table_2 B
         ON (CODE=CODE) ;

 


by alues [2014.04.21 11:58:02]

예로는 테이블을 저렇게 썻는데

실제로 두개의 테이블이 조인이 될수가 없어요..


by 농부지기 [2014.04.21 12:05:00]

자료 컬럼과 예제를 정확하게 올려주세요.

결과에 대한 예제하구요.

그래야, 질문자님께서 원하는 답변이 나올거 같네요.


by alues [2014.04.21 12:21:20]

수정했어요


by 농부지기 [2014.04.21 12:32:55]

제가 처음에 올렸던 답변이 맞았네요.

이번에 위 답변중 첫 번째만 올릴 게요.

위 답변을 한번더 보시고, 두번째 답변이 마음에 드시면 응용하면 될거에요.

 

WITH T1(CO, NO, CUST, QTY, AMT) AS
   ( SELECT '1111', '1001', '99', 10, 1000 FROM DUAL UNION ALL
     SELECT '1111', '1002', '88', 20, 2000 FROM DUAL UNION ALL
     SELECT '1111', '1003', '77', 30, 3000 FROM DUAL )
   , T2(CO, CUST, CUST2) AS
   ( SELECT '1111', '99', '99' FROM DUAL UNION ALL
     SELECT '1111', '88', '88' FROM DUAL UNION ALL
     SELECT '1111', '66', '66' FROM DUAL )

SELECT A.*
     --, 함수호출
  FROM (
        SELECT DECODE(T1.CO   , NULL, T2.CO  , T1.CO  )   AS CO
             , DECODE(T1.CUST , NULL, T2.CUST, T1.CUST) AS CUST
             , DECODE(T1.QTY  , NULL, 0      , T1.QTY )   AS QTY
             , DECODE(T1.AMT  , NULL, 0      , T1.AMT )   AS AMT
          FROM T1 FULL JOIN T2
                ON (    T1.CO   = T2.CO
                    AND T1.CUST = T2.CUST )
       ) A ;


 


by 마농 [2014.04.21 15:42:18]

DECODE 는 간략하게 NVL 로...


by alues [2014.04.21 17:48:08]

SELECT a.cus_cd
, b.cus_cd       FROM sal020 a
full  join (SELECT shop_cd, cus_cd2 cus_cd FROM cap050 WHERE shop_cd = '1000' and accd = '1110' and ymd BETWEEN '20140101' AND '20140228' group by shop_cd, cus_cd ) b
on b.shop_cd = a.shop_cd
and b.cus_cd = a.cus_cd
    WHERE a.shop_cd = '1000' AND a.sal_dt BETWEEN '20140101' AND '20140228' 
GROUP BY a.cus_cd, a.shop_cd
, b.shop_cd, b.cus_cd

저렇게 삽입이 안되네요. 조금 다르게 짜봤는데 이렇게 하면 sal020이라는 테이블 값은 다 나오고 같은거는 같은게 나오고 없는거는 null로 나오는데 기준이 sal020으로 되어있어서.. cap050이라는 테이블 값은 다 안나와요.. 잘못짜진건가요? .. cap050만 조회해서 나오는 어떤값중 한개도 저렇게 조회했을 때 나와야 하는데 그 값이 안나오네요..


by 마농 [2014.04.21 22:02:13]

네. 잘못 짜진 거네요.

b 에 서브쿼리 썼듯이 a 도 서브쿼리 쓰세요.

그런데 Group By 는 왜 하는지?


by alues [2014.04.22 10:30:18]

서브쿼리에서 group by한거는 없앴고요.

제일 마지막에 group by는.. 실제 내용은 순번대로 여러개 있어서 cus_cd는 하나만 있으면 되니깐 한거고요.

a에 서브쿼리르 주라는 말이 어떤건지 이해가 안되네요..

b에서는 cus_cd만 가져오면 되고 a기준에서 수량 등등 다른것들을 뽑아야 하거든요..


by alues [2014.04.22 10:45:05]

SELECT CASE WHEN a.cus_cd IS NULL THEN b.cus_cd ELSE a.cus_cd END cus_cd FROM (SELECT shop_cd, cus_cd FROM sal020  WHERE shop_cd = '1000' AND sal_dt BETWEEN '20140201' AND '20140228') a
full join (SELECT shop_cd, cus_cd2 cus_cd FROM cap050 WHERE shop_cd = '1000' and accd = '1110' and ymd BETWEEN '20140201' AND '20140228') b
on b.shop_cd = a.shop_cd and b.cus_cd = a.cus_cd
   

GROUP BY a.cus_cd, a.shop_cd, b.shop_cd, b.cus_cd

 

이렇게 하니 나오네요


by 마농 [2014.04.22 11:10:29]

Group By 는 왜 하시는 건가요?

중복제거를 위해서라면?

중복은 a에만 있나요 b 에도 있나요?

조인후 중복제거하지 마시고 서브쿼리(인라인뷰) 안에서 미리 중복제거하세요.

단순 중복제거라면  Distinct 를 이용하세요.


by alues [2014.04.22 11:18:40]

cus_cd가 한개가 있는게 아니고 여러개 있어서 합니당. a와 b 안에도 여러개의 cus_cd가 있고요.

단순 제거는 힘든게 수량도 합곌르 해줘야하기때문에..

어찌짜긴 했는데 맞는지는 모르겠네요.


by 마농 [2014.04.22 11:22:31]

중복자료가 존재한다면?

각각 따로 그룹바이한 후 조인하세요.


by alues [2014.04.22 11:24:32]

SELECT CASE WHEN a.cus_cd IS NULL THEN b.cus_cd ELSE a.cus_cd END cus_cd,
                CASE WHEN a.shop_cd IS NULL THEN b.shop_cd ELSE a.shop_cd END shop_cd,
                Sum(a.ge_qty)
          FROM
            (SELECT shop_cd, cus_cd, sum(ge_qty) ge_qty, sum(price) price, sum(vat) vat FROM sal020  WHERE shop_cd = '1000' AND sal_dt BETWEEN '20140201' AND '20140228' group by shop_cd, cus_cd) a
                full join (SELECT shop_cd, cus_cd2 cus_cd, sum(cr) cr FROM cap050 WHERE shop_cd = '1000' and accd = '1110' and ymd BETWEEN '20140201' AND '20140228' group by shop_cd, cus_cd) b
                on b.shop_cd = a.shop_cd and b.cus_cd = a.cus_cd

       GROUP BY cus_cd, shop_cd

 

이렇게 하면되나요? 맞게 나오는거 같은데


by 마농 [2014.04.22 12:54:04]

마지막 그룹바이는 빼세요.


by alues [2014.04.22 13:38:41]

group by뺴고 sum빼니 잘되네요

감사합니다

채택이 2개가 안되네요.. ㅠ


by 마농 [2014.04.22 13:52:29]

단순하게 넣고 빼고 하다보니 되더라 하지 마시고.

해당 기능을 언제 넣고 언제 빼야 하는지를 이해하고 적재적소에 사용하셔야 합니다.


by alues [2014.04.22 14:00:41]

네 잘알겠습니다 ㅠㅠ.

SQL은 짤때마다 너무 어려운거 같아요..

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