sql 잘 하시는 분께 질문입니다 정보
sql 잘 하시는 분께 질문입니다본문
k1 table
----------------------
item ca_name ipqty
-----------------------
AAA a1 3
AAA a2 5
BBB a1 4
BBB a2 5
CCC a1 3
DDD a2 3
----------------------
k2 table
----------------------
item ca_name useqty
----------------------
AAA a1 1
AAA a1 1
AAA a2 2
AAA a2 3
BBB a1 2
BBB a1 2
BBB a2 2
BBB a2 1
CCC a1 3
----------------------
결과
-------------------------
item ipqty useqty janqty
-------------------------
AAA 8 7 1
BBB 9 7 2
CCC 3 3 0
DDD 3 0 3
k1, k2 두 테이블을 join해서 sum(ipqty), sum(useqty) 값을 구할 수 있을까요?
select a.item, sum(ipqty) as isum, sum(useqty) as uqty from k1 a LEFT JOIN k2 b
on(a.item=b.item and a.ca_name=b.ca_name) group by a.item
이걸로는 당연히 안되는 것일테고..
janqty는 쿼리 후 for문에서 따로 계산해도 되는 것이지만...
댓글 전체
from k1 left outer join k2 (k1.item = k2.item)
group by k1.item
대략 이런식이지만 k1,k2 가 어떤 관계이느냐에 따라 달라질 수 있습니다.
full outer join 을 걸 수도 있으니까요
mysql에서 null 값처리는 함수를 한번 찾아서 고쳐주어야 합니다.
on(a.item=b.item and a.ca_name=b.ca_name) group by a.item
문제는 일반적인 left join으로는 아래처럼 결합되어 sum을 낸다는 것입니다
즉 sum(ipqty) 값이 중복 계산 되어버린다는 것입니다
AAA항목의 sum(ipqty)=8 이어야 하는데 16 이 되어버리는 것입니다
item ca_name ipqty useqty
---------------------------
AAA a1 3 1
AAA a1 3 1
AAA a2 5 2
AAA a2 5 3
........
...........
쿼리를 두번해서 다른 방법으로 하고는 있지만
k2 테이블을 group by해서 sum을 내고 이걸 k1테이블과 join하는 서브쿼리 방법 같은 것이 있지않을까 싶어서말이죠
더 구체적으로 디비 테이블을 적어 보세요.
그런데 값이 중복 입력 되어있는 것은 아닙니다
join하지않고 k1 테이블만 sum(ipqty) 하면 원하는 값이 나오거든요
k1 table
----------------------
item ca_name ipqty
-----------------------
AAA a1 3
=======================================
k2 table
----------------------
item ca_name useqty
----------------------
AAA a1 1
AAA a1 1
이것을 left join 하면 레코드가 2개만들어지는 것이고
group by item 하면 레코드는 하나이지만 sum(ipqty) 값은 6 이 나오는 것이 정상이지않나요?
(ifnull 과는 관계없이)
원하는 것은 sum(ipqty) 값은 3, sum(useqty)값은 2 가 나오도록 하는 것입니다만..
union all 로 작성해야 되네요.
그런데 mysql에서 inline 뷰가 먹는지 모르겠네요. 버젼 4.1 이하는 안될듯 하네요.
아래도 적절히 수정하셔야 할듯... 대충 하는 버릇이 있어서.
select item, sum(ipqty), sum(useqty), sum(ifnull(ipqty,0) - ifnull(useqty,0)) as janqty
from (select k1.item, 0 useqty, sum(k1.ipqty) ipqty
from k1
group by k1.item
union all
select k2.item, sum(k2.useqty) useqty, 0 ipqty
from k2
group by k2.item)
group by item