2011-04-13 7 views
0

gfee 및 netpay에 잘못된 값이 표시됩니다.mysql의 값이 잘못되었습니다. INNER JOIN

SELECT s.id, s.name, c.name AS course_name, 
s.open_bal AS open_balance, sum(i.amount) AS gross_fee, 
sum(i.discount) AS discount, sum(i.amount) - sum(i.discount) AS net_payable, 
SUM(r.reg_fee+r.tut_fee+r.other_fee) AS net_recieved, 
(sum(i.amount) - sum(i.discount)) - SUM(r.reg_fee+r.tut_fee+r.other_fee) AS balance_due 
FROM subscribers s 
INNER JOIN courses c on c.id = s.course_id 
LEFT JOIN invoices i on i.student_id = s.id 
LEFT JOIN recipts r on r.student_id = s.id 
GROUP BY s.id; 

왜 이런 일이 발생합니까?

+0

'잘못된'이란 무엇입니까? 당신은 무엇을 얻고 당신은 옳은 것을 기대합니까? –

+0

@ypercube 3500 대신 gross_fee로 70000을 얻고 있습니다. – seoppc

+0

'student_id'에 대해 'recipts'에 두 개의 레코드가있는 것처럼 들립니다. 어쩌면 몇 가지 추가 조인 조건이 누락 되었습니까? –

답변

1
SELECT s.id 
    , s.name 
    , c.name AS course_name 
    , s.open_bal AS open_balance 
    , igroup.gross_fee 
    , igroup.discount 
    , igroup.net_payableinvoices 
    , rgroup.net_recieved 
    , igroup.net_payableinvoices - rgroup.net_recieved 
     AS balance_due 
FROM students s 
INNER JOIN courses c 
    on c.id = s.course_id 
LEFT JOIN 
    (SELECT i.student_id 
     , SUM(i.amount) AS gross_fee 
     , SUM(i.discount) AS discount 
     , SUM(i.amount) - sum(i.discount) 
      AS net_payableinvoices 
    FROM invoices i 
    GROUP BY i.student_id 
) AS igroup 
    ON igroup.student_id = s.id 
LEFT JOIN 
    (SELECT r.student_id 
     , SUM(r.reg_fee+r.tut_fee+r.other_fee) 
      AS net_recieved 
    FROM recipts r 
    GROUP BY r.student_id 
) AS rgroup 
    ON rgroup.student_id = s.id 
; 
+0

지금 시도하십시오 ('i'가 잘못 배치되었습니다). 당신의 에러 메시지에'fm_invoices'가 왜 있는지 잘 모르겠습니다. –

+0

나는'gross_fee : 35000 |을 얻고 있기 때문에 20000 대신 -15000을주는 balance_due를 주었다. 할인 : 0 | net_payableinvoices : 35000 | net_recieved : 15000 | balance_due : -15000' – seoppc

+0

이것은 내가 가고자하는 곳입니다. 모든 인보이스를 미리 집계하고, 영수증을 각자의 학생 ID 당 하나씩 받으면 학생과 합류합니다. 잘 정리되어 있습니다. – DRapp

1

문제의 가장 큰 원인은 조인 된 테이블 중 하나에 여러 행이 있다는 것입니다.

정확히 두 번 예상 값 (70000 대 35000)을 얻고 있기 때문에 student_id=22courses 또는 recipts 테이블에 두 개의 행이 있다고 생각합니다.

+0

예 recipts에는 2 행이 있지만이 문제를 해결하는 방법은 무엇입니까?이 코드를 최적화하여 더 좋은 결과를 얻으려면 어떻게해야합니까? – seoppc

+0

글쎄,'recipts' 테이블의 어느 행이 당신의 계산에 적합한 것인지 알아야합니다. 그런 다음 조인을 'r.student_id = s.id 및 r.something = [필터 값]'에서'왼쪽 조인 recipts r '으로 업데이트 할 수 있습니다. –

+0

나는 (학생 테이블에서) id가 student_id (recipt 테이블에서)와 같은 recipts에있는 모든 행 (지불 열)을 합해서 싶습니다. 그 학생으로부터 총 지불액을 받고 싶습니다. – seoppc

0

70,000이 2 배인 35,000이라는 사실은 매우 중요한 단서입니다. 당신은 SUM에 대해 이야기하고 있고 당신은 당신이 예상했던 것의 두 배를 얻고 있습니다. 그것은 당신이 생각하는 것보다 2 배 많은 행에 합류하고 있음을 강력하게 암시합니다.

이 구체적으로 어려운 스키마의 세부 사항을 모른 채

하지만 (이 특정 레코드에 대한) invoices에서 각 행에 대해 receipts에 두 개의 서로 다른 행에 가입하는 경우, 당신은이 개 35,000 항목으로 결국은에 포함 너의 총. 네가 염두에 두었던 것이 아니다.

+0

나는 당신이 저에게서 무엇이든을 필요로하는 경우에, 당신이 나의 SQL 조회에서 볼 수 있던대로, 송장, recipts에 근거를 둔 모든 학생을위한보고를 얻고 싶, 저에게 감사하고 싶다. – seoppc

+0

recipts 테이블에 대한 업데이트 된 질문을 확인하십시오. – seoppc