특정 조건으로 sum값 구하는 방법이 있을까요? 0 2 4,072

by 정수리형 [MySQL] [2018.11.05 13:29:51]


A테이블

xid contractMoney

 10   1000,000

B테이블

Bid   xid   payMoney

 1     10     1000,00

 2     10     3000,00

 

C테이블

Cid  xid    bdMoney

 1    10       10,000

 2    10       20,000

 

이렇게 테이블이 구성되어있습니다.

 

select contractMoney, contractMoney-sum(payMoney) , sum(payMoney),  sum(by_mondy) from A테이블 as a LEFT JOIN B테이블 as b on A.xid = B.xid LEFT JOIN C테이블 as c on A.xid = C.xid where A.xid = 10

위의 쿼리를 사용했을 경우 sum함수를 사용했을 경우 항목들의 합계 xid가 10인 데이터들만 합계가 나와야 하는데 해당 B테이블, C테이블에 

 

등록된 모든 데이터들의 합계가 출력되어 버리네요 ㅜㅜ

 

쿼리문에서 C테이블 빼고 A,B테이블만 left join했을 경우 sum 함수를 사용했을 시 xid 가 10인 건들만 합계가 되어 나오는데

 

left join 하나가 더 추가되니 엉뚱한 데이터가 출력이 됩니다.

 

어떻게 해야 xid 10인 건들만 정상적으로 합계를 구할수 있을까요?

 

(단편적으로 A,B,C 테이블만 예로 들었지만 실질적으로 테이블이 좀 더 추가될수 있습니다.)

 

by 마농 [2018.11.05 13:59:59]

조인은 보통 1:1 또는 1:다 조인을 해야 합니다.
그런데 지금 다:다 조인이 되어 버렸네요?
A:B:C 의 관계가 1:다:다 입니다.
다:다 관계의 경우 카티션프러덕트라고 하는 원치않는 뻥튀기 현상이 발생됩니다.
위의 경우 B 2건, C 2건으로 2 * 2 = 4 가 되어 버림. 값이 두배로 나오게 됨.
다:다 관계를 1:1 관계로 만들어 조인해야 합니다.
 

SELECT a.xid
     , a.contractMoney
     , a.contractMoney - IFNULL(b.payMoney, 0) 
     , b.payMoney
     , c.by_mondy
  FROM A테이블 a
  LEFT OUTER JOIN
       (SELECT xid
             , SUM(payMoney) payMoney
          FROM B테이블
         WHERE xid = 10
         GROUP BY xid
        ) b
    ON a.xid = b.xid
  LEFT OUTER JOIN
       (SELECT xid
             , SUM(by_mondy) by_mondy
          FROM C테이블
         WHERE xid = 10
         GROUP BY xid
        ) c
    ON a.xid = c.xid
 WHERE a.xid = 10
;

 


by 정수리형 [2018.11.05 14:28:44]

답변감사합니다.

따로 개인적으로 질문이 있는데

제가 db쪽은 나름 기본이 부족하다보니 공부를 하고 싶은데

추천해주실만한  db기본서가 있을까요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입