2014-04-19 4 views
0

3 개의 테이블이 있습니다. practices, adjustmentsclaims.
추가 사례가있는 모든 사례를 선택해야합니다. adjustments.amount + count(claims.id)조인 된 테이블의 고유 한 행 합

여기가 내 검색어입니다. 내 데이터베이스에서

SELECT 
practices.*, 
(
    SUM(adjustments.amount) + count(claims.id) 
) as accurred_fees 
    INNER JOIN adjustments ON adjustments.practice_id = practices.id 
    INNER JOIN claims ON claims.practice_id = practices.id 
GROUP BY practices.id 

나는 1 연습, 20 주장과 2에 같은 양의 1 조정을해야합니다. 쿼리의 SUM(eligible_fee_adjustments.amount)은 항상 40을 반환합니다. 2 * count (claims.id)라고 생각합니다. 왜 그렇게 행동하는지 모르겠습니다. 해결책을 찾도록 도와주세요. 미리 감사드립니다.

+1

테이블과 일부 데이터는 http://sqlfiddle.com에 게시 할 수 있으며 예상되는 결과는 ur입니다. –

답변

3

두 개의 서로 다른 차원을 따라 합류하는 문제가있어서 행에 곱셈이 적용됩니다. 데이터를 사전 집계하여이 문제를 해결할 수 있습니다. 당신은 아마뿐만 아니라 조정을 preaggregate한다

SELECT p.*, 
     (SUM(a.amount) + c.cnt) as accurred_fees 
FROM practices p INNER JOIN 
    adjustments a 
    ON a.practice_id = p.id INNER JOIN 
    (SELECT practice_id, count(*) as cnt 
     FROM claims c 
     GROUP BY practice_id 
    ) c 
    ON c.practice_id = p.id 
GROUP BY p.id; 

: 다음은이 특정 문제가 해결됩니다

SELECT p.*, 
     (a.amount + c.cnt) as accurred_fees 
FROM practices p INNER JOIN 
    (SELECT practice_id, SUM(amount) as amount 
     FROM adjustments a 
     GROUP BY practice_id 
    ) a 
    ON a.practice_id = p.id INNER JOIN 
    (SELECT practice_id, count(*) as cnt 
     FROM claims c 
     GROUP BY practice_id 
    ) c 
    ON c.practice_id = p.id 
GROUP BY p.id; 

그리고 당신은 그래서 당신은 심지어 모든 방법을 얻을 LEFT OUTER JOIN 오히려 INNER JOIN보다 고려하는 것이 좋습니다 그 조정이나 클레임이 누락되었을 수 있습니다.

+0

고마워, 너의 접근 방식이 나에게 많은 도움이되었다. 그러나 "claim"테이블을 통해 조인 된 네 번째 테이블을 가지고 있다면 어떻게해야합니까? 필자의 경우 제 4 테이블'제출 (submissions) '을'claim'테이블 (doble join)을 통해 결합했다. 어떻게해야합니까? 계산에 "제출"횟수를 사용하려면 어떻게해야합니까? – Pavel

+0

@Pavel. . . 추가 정보가 없으면 제출물을 'c'하위 쿼리에 하위 쿼리로 추가하는 것이 좋습니다. –

관련 문제