sql 잘 하시는 분께 질문입니다 > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

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

댓글 전체

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 값처리는 함수를 한번 찾아서 고쳐주어야 합니다.
두 분 답변 감사합니다만
문제는 일반적인 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
전체 130,605
십년전오늘 내용 검색

회원로그인

진행중 포인트경매

  1. 참여2 회 시작24.04.25 20:23 종료24.05.02 20:23
(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT