Todavía no ha proporcionado información completa:no hay una tabla de lotes, ni siquiera la tabla de recibos que no existe. De todos modos, supongo que no nos importa qué hay en la tabla de lotes, digamos que es solo el nombre y la identificación. Su tabla de recibos tiene múltiples filas para el mismo estudiante. Esto debería dar como resultado múltiples filas devueltas para las otras tablas también, debido a todos los JOIN. Por lo tanto, SUMA () valores de múltiples veces que deben sumarse solo una vez, es decir, saldo_abierto. Esto podría ser una pista de dónde está el problema, diría que tiene que mover la información que necesita de la tabla de recibos a las subconsultas, pero no estoy seguro de que nos haya mostrado la totalidad de su base de datos. Intente eliminar la tabla de recibos de la consulta y verifique los resultados nuevamente. Si eso es todo, debería ver qué hacer a partir de ahí o al menos darnos más información.
EDITAR: La consulta debe ser:
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;
Esto sumará los datos de los estudiantes en la tabla de recibos, incluso si está en más de una fila, devolviendo solo una fila. Al eliminar la unión a la tabla de recibos, se eliminan las líneas duplicadas de las otras tablas, por lo que los cálculos ahora deberían ser correctos.
Una cosa más:tienes s.inactive = 0
en la cláusula WHERE, asegúrese de que no sea relevante para estos cálculos.
PD ¿Cómo es que no sabes qué es una subconsulta y terminas escribiendo cosas así?