Du har stadig ikke givet fuld information - ingen batch-tabel, selv den ikke-eksisterende recepttabel. I hvert fald går jeg ud fra, at vi er ligeglade med, hvad der er i batch-tabellen, lad os sige, at det kun er navnet og id'et. Din kvitteringstabel har flere rækker for den samme elev. Dette skulle resultere i, at flere rækker også returneres for de andre tabeller på grund af alle JOIN'erne. Derfor SUMMER() flere gange værdier, som kun skal summeres én gang, dvs. open_balance. Dette kunne være et fingerpeg om, hvor problemet er, jeg vil sige, at du skal flytte den information, du har brug for, fra 'kvitteringstabellen' til underforespørgsler, men jeg er ikke sikker på, at du har vist os hele din DB. Prøv at fjerne kvitteringstabellen fra forespørgslen, og tjek resultaterne igen. Hvis det er det, bør du se, hvad du skal gøre derfra eller i det mindste give os flere oplysninger.
EDIT: Forespørgslen skal være:
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;
Dette vil opsummere elevernes data i kvitteringstabellen, selvom det er på mere end én række, hvilket kun returnerer én række. Fjernelse af joinforbindelsen til kvitteringstabellen fjerner duplikerede linjer fra de andre tabeller, så beregningerne skulle nu være korrekte.
En ting mere - du har s.inactive = 0
i WHERE-sætningen skal du sørge for, at den ikke er relevant for disse beregninger.
P.S. Hvorfor ved du ikke, hvad en underforespørgsel er, og du ender med at skrive sådan noget?