| 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배의 값이 나와버리고요..
다른값이 들어있는 경우는 그냥 그대로 뽑으면 되는데 동일한 값이 있을때가 문제네요
동일한 값 기준은 거래처 기준이고요.
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) ;
예로는 테이블을 저렇게 썻는데
실제로 두개의 테이블이 조인이 될수가 없어요..
자료 컬럼과 예제를 정확하게 올려주세요.
결과에 대한 예제하구요.
그래야, 질문자님께서 원하는 답변이 나올거 같네요.
수정했어요
제가 처음에 올렸던 답변이 맞았네요.
이번에 위 답변중 첫 번째만 올릴 게요.
위 답변을 한번더 보시고, 두번째 답변이 마음에 드시면 응용하면 될거에요.
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 ;
DECODE 는 간략하게 NVL 로...
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만 조회해서 나오는 어떤값중 한개도 저렇게 조회했을 때 나와야 하는데 그 값이 안나오네요..
네. 잘못 짜진 거네요.
b 에 서브쿼리 썼듯이 a 도 서브쿼리 쓰세요.
그런데 Group By 는 왜 하는지?
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
이렇게 하니 나오네요
서브쿼리에서 group by한거는 없앴고요.
제일 마지막에 group by는.. 실제 내용은 순번대로 여러개 있어서 cus_cd는 하나만 있으면 되니깐 한거고요.
a에 서브쿼리르 주라는 말이 어떤건지 이해가 안되네요..
b에서는 cus_cd만 가져오면 되고 a기준에서 수량 등등 다른것들을 뽑아야 하거든요..
Group By 는 왜 하시는 건가요?
중복제거를 위해서라면?
중복은 a에만 있나요 b 에도 있나요?
조인후 중복제거하지 마시고 서브쿼리(인라인뷰) 안에서 미리 중복제거하세요.
단순 중복제거라면 Distinct 를 이용하세요.
cus_cd가 한개가 있는게 아니고 여러개 있어서 합니당. a와 b 안에도 여러개의 cus_cd가 있고요.
단순 제거는 힘든게 수량도 합곌르 해줘야하기때문에..
어찌짜긴 했는데 맞는지는 모르겠네요.
중복자료가 존재한다면?
각각 따로 그룹바이한 후 조인하세요.
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
이렇게 하면되나요? 맞게 나오는거 같은데
마지막 그룹바이는 빼세요.
group by뺴고 sum빼니 잘되네요
감사합니다
채택이 2개가 안되네요.. ㅠ
단순하게 넣고 빼고 하다보니 되더라 하지 마시고.
해당 기능을 언제 넣고 언제 빼야 하는지를 이해하고 적재적소에 사용하셔야 합니다.
네 잘알겠습니다 ㅠㅠ.
SQL은 짤때마다 너무 어려운거 같아요..