Все още не сте предоставили пълна информация - няма таблица с партиди, дори несъществуващата таблица с рецепти.. Както и да е, предполагам, че не ни интересува какво има в таблицата с партиди, да кажем, че е само името и идентификатора. Вашата таблица с разписки има няколко реда за един и същ ученик. Това трябва да доведе до връщане на няколко реда и за другите таблици, поради всички JOIN. Следователно вие SUM() многократно стойности, които трябва да бъдат сумирани само веднъж, т.е. open_balance. Това може да е улика за това къде е проблемът, бих казал, че трябва да преместите информацията, която ви е необходима, от таблицата с разписките в подзаявки, но не съм сигурен, че сте ни показали цялата си база данни. Опитайте да премахнете таблицата с разписките от заявката и проверете резултатите отново. Ако това е всичко, трябва да видите какво да правите оттук нататък или поне да ни дадете повече информация.
РЕДАКТИРАНЕ: Заявката трябва да бъде:
SELECT
b.name AS batch_name,
b.id AS batch_id,
COUNT(DISTINCT s.id)
AS total_students,
COALESCE( SUM(s.open_bal), 0 )
AS open_balance,
SUM( COALESCE(i.reg_fee, 0)
+ COALESCE(i.tut_fee, 0)
+ COALESCE(i.other_fee, 0)
) AS gross_fee,
SUM( COALESCE(i.discount, 0) )
AS discount,
COALESCE( SUM(s.open_bal), 0 )
+ SUM( COALESCE(i.reg_fee, 0)
+ COALESCE(i.tut_fee, 0)
+ COALESCE(i.other_fee, 0)
)
- SUM( COALESCE(i.discount, 0) )
AS net_payable,
SUM((SELECT SUM(COALESCE(receipts.reg_fee, 0)
+ COALESCE(receipts.tut_fee, 0)
+ COALESCE(receipts.other_fee, 0)) FROM receipts WHERE receipts.student_id = s.id))
AS net_recieved,
( COALESCE( SUM(s.open_bal), 0 )
+ SUM( COALESCE(i.reg_fee, 0)
+ COALESCE(i.tut_fee, 0)
+ COALESCE(i.other_fee, 0)
)
- SUM( COALESCE(i.discount, 0) )
)
- SUM((SELECT SUM(COALESCE(receipts.reg_fee, 0)
+ COALESCE(receipts.tut_fee, 0)
+ COALESCE(receipts.other_fee, 0)) FROM receipts WHERE receipts.student_id = s.id))
AS balance_due
FROM batches b
LEFT JOIN students s ON s.batch = b.id
LEFT JOIN invoices i ON i.student_id = s.id
WHERE s.inactive = 0
GROUP BY b.name, b.id;
Това ще сумира данните за учениците в таблицата с разписки, дори ако е на повече от един ред, връщайки само един ред. Премахването на присъединяването към таблицата с разписки премахва дублиращи се редове от другите таблици, така че изчисленията вече трябва да са правилни.
Още нещо - имате s.inactive = 0
в клаузата WHERE се уверете, че не е от значение за тези изчисления.
P.S. Как така не знаеш какво е подзаявка и накрая пишеш такива неща?