आपने अभी भी पूरी जानकारी प्रदान नहीं की है - कोई बैच तालिका नहीं, यहां तक कि मौजूदा रसीद तालिका भी नहीं है .. वैसे भी, मुझे लगता है कि हमें बैच तालिका में क्या परवाह नहीं है, मान लीजिए कि यह सिर्फ नाम और आईडी है। आपकी रसीद तालिका में एक ही छात्र के लिए कई पंक्तियाँ हैं। इसके परिणामस्वरूप सभी जॉइन के कारण, अन्य तालिकाओं के लिए भी कई पंक्तियाँ वापस आ जानी चाहिए। इसलिए आप SUM () कई बार मान जो केवल एक बार सम्मिलित किए जाने चाहिए, अर्थात open_balance। यह एक सुराग हो सकता है कि समस्या कहां है, मैं कहूंगा कि आपको उस जानकारी को स्थानांतरित करना होगा जो आपको 'रसीद तालिका' से सबक्वायरी में ले जाना है, लेकिन मुझे यकीन नहीं है कि आपने हमें अपने डीबी की संपूर्णता दिखाई है। प्राप्ति तालिका को क्वेरी से निकालने का प्रयास करें और परिणामों की फिर से जाँच करें। अगर ऐसा है, तो आपको देखना चाहिए कि वहां से क्या करना है या कम से कम हमें और जानकारी दें।
संपादित करें: क्वेरी होनी चाहिए:
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;
यह छात्रों के डेटा को रसीद तालिका में जोड़ देगा, भले ही वह एक से अधिक पंक्तियों पर हो, केवल एक पंक्ति लौटा रहा हो। रसीद तालिका में शामिल होने को हटाने से अन्य तालिकाओं से डुप्लिकेट लाइनें निकल जाती हैं, इसलिए गणना अब सही होनी चाहिए।
एक और बात - आपके पास s.inactive = 0
. है WHERE क्लॉज में, सुनिश्चित करें कि यह इस गणना के लिए प्रासंगिक नहीं है।
पी.एस. आप कैसे नहीं जानते कि उप क्वेरी क्या है और आप इस तरह की सामग्री लिखना समाप्त कर देते हैं?