неверное значение на mysql INNER JOIN - PullRequest
0 голосов
/ 13 апреля 2011

Я получаю неправильное значение для gfee и netpay.

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;

Почему это происходит?

Ответы [ 3 ]

1 голос
/ 13 апреля 2011
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
;
1 голос
/ 13 апреля 2011

Наиболее вероятной причиной вашей проблемы является наличие нескольких строк в одной из соединенных таблиц.

Поскольку вы получаете в два раза больше ожидаемого значения (70000 против 35000), я бы предположил, что в нем есть две строкитаблицы courses или recipts с student_id=22.

0 голосов
/ 13 апреля 2011

Тот факт, что 70 000 - это двойные 35 000, является чрезвычайно важной подсказкой. Вы говорите о SUM и получаете вдвое больше, чем ожидали. Это говорит о том, что вы присоединяетесь к вдвое большему количеству строк, чем думаете.

Не зная деталей вашей схемы, сложно быть конкретным, но если вы объединяетесь в две разные строки в receipts для каждой строки в invoices (для этой конкретной записи), вы получите два 35,000 записей включены в вашу сумму. Не то, что вы имели в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...