まだ完全な情報を提供していません。バッチテーブルはなく、既存のレシピテーブルもありません。とにかく、バッチテーブルの内容は気にしないと思います。名前とIDだけだとしましょう。領収書テーブルには、同じ学生の複数の行があります。これにより、すべてのJOINが原因で、他のテーブルにも複数の行が返されるはずです。したがって、SUM()は、一度だけ合計する必要がある値、つまりopen_balanceを複数回合計します。これは、問題がどこにあるかについての手がかりになる可能性があります。必要な情報をレシートテーブルからサブクエリに移動する必要があると思いますが、DB全体を表示したかどうかはわかりません。クエリからレシートテーブルを削除して、結果をもう一度確認してください。それだけの場合は、そこから何をすべきかを確認するか、少なくとも詳細情報を提供してください。
編集: クエリは次のようになります:
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;
これにより、複数の行にある場合でも、レシートテーブルの学生データが合計され、1行だけが返されます。レシートテーブルへの結合を削除すると、他のテーブルから重複する行が削除されるため、計算が正しく行われるはずです。
もう1つ-s.inactive = 0
があります WHERE句で、この計算に関連していないことを確認してください。
P.S.どうしてサブクエリが何であるかわからず、そのようなものを書くことになりますか?