Vous n'avez toujours pas fourni d'informations complètes - pas de table de lots, même la table de recettes inexistante. Votre tableau des reçus comporte plusieurs lignes pour le même étudiant. Cela devrait entraîner le renvoi de plusieurs lignes pour les autres tables également, en raison de tous les JOIN. Par conséquent, vous SUM() plusieurs fois les valeurs qui ne doivent être additionnées qu'une seule fois, c'est-à-dire open_balance. Cela pourrait être un indice quant à l'endroit où se situe le problème, je dirais que vous devez déplacer les informations dont vous avez besoin de 'la table des reçus dans des sous-requêtes, mais je ne suis pas sûr que vous nous ayez montré l'intégralité de votre base de données. Essayez de supprimer la table des reçus de la requête et vérifiez à nouveau les résultats. Si c'est tout, vous devriez voir quoi faire à partir de là ou au moins nous donner plus d'informations.
MODIF : La requête doit être :
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;
Cela additionnera les données des étudiants dans le tableau des reçus même s'il se trouve sur plusieurs lignes, renvoyant une seule ligne. La suppression de la jointure à la table des reçus supprime les lignes en double des autres tables, de sorte que les calculs doivent maintenant être corrects.
Encore une chose - vous avez s.inactive = 0
dans la clause WHERE, assurez-vous qu'elle n'est pas pertinente pour ces calculs.
PS Comment se fait-il que vous ne sachiez pas ce qu'est une sous-requête et que vous finissiez par écrire des choses comme ça ?