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 ;
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만 조회해서 나오는 어떤값중 한개도 저렇게 조회했을 때 나와야 하는데 그 값이 안나오네요..
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
이렇게 하니 나오네요
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
이렇게 하면되나요? 맞게 나오는거 같은데