sql 잘 하시는 분께 질문입니다 > 자유게시판

자유게시판

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문에서 따로 계산해도 되는 것이지만...

추천
0
  • 복사

댓글 7개

select k1.item, sum(useqty) uqty, sum(ipqty) ipqty, sum(useqty) - sum(ipqty) janqty
from k1 left outer join  k2 (k1.item = k2.item)
group by k1.item

대략 이런식이지만 k1,k2 가 어떤 관계이느냐에 따라 달라질 수 있습니다.
full outer join 을 걸 수도 있으니까요

mysql에서 null 값처리는 함수를 한번 찾아서 고쳐주어야 합니다.
select a.item, sum( ifnull( ipqty, 0)) as isum, sum(  ifnull( useqty, 0)) 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
두 분 답변 감사합니다만
문제는 일반적인 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하는 서브쿼리 방법 같은 것이 있지않을까 싶어서말이죠
중복 된다면 애초에 데이터 자체가 중복으로 저장되어 있다는 것입니다.
더 구체적으로 디비 테이블을 적어 보세요.
XML님 답변 감사합니다
그런데 값이 중복 입력 되어있는 것은 아닙니다
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 가 나오도록 하는 것입니다만..
그렇군요. 제가 처음 작성한 sql 이 잘못됐군요.
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
© SIRSOFT
현재 페이지 제일 처음으로