Stále jste neposkytli úplné informace - žádná tabulka dávek, dokonce ani neexistující tabulka receptů. Každopádně předpokládám, že je nám jedno, co je v tabulce dávek, řekněme, že je to jen jméno a id. Vaše tabulka účtenek má více řádků pro stejného studenta. Výsledkem by mělo být více řádků vrácených i pro ostatní tabulky, kvůli všem JOINům. Proto SUM() vícekrát hodnoty, které je třeba sečíst pouze jednou, tj. open_balance. To by mohlo být vodítkem, kde je problém, řekl bych, že musíte přesunout informace, které potřebujete, z „tabulky účtenek do dílčích dotazů, ale nejsem si jistý, zda jste nám ukázali celou svou DB. Zkuste z dotazu odebrat tabulku účtenek a znovu zkontrolujte výsledky. Pokud je to tak, měli byste vidět, co dál dělat, nebo nám alespoň poskytnout více informací.
UPRAVIT: Dotaz by měl být:
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;
Tím se sečtou data studentů v tabulce účtenek, i když je na více než jednom řádku, vrátí se pouze jeden řádek. Odebráním spojení s tabulkou účtenek odstraníte duplicitní řádky z ostatních tabulek, takže výpočty by nyní měly být správné.
Ještě jedna věc – máte s.inactive = 0
v klauzuli WHERE se ujistěte, že to není pro tyto výpočty relevantní.
P.S. Jak to, že nevíte, co je dílčí dotaz, a nakonec píšete takové věci?