Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जटिल MySQL क्वेरी गलत परिणाम

आपने अभी भी पूरी जानकारी प्रदान नहीं की है - कोई बैच तालिका नहीं, यहां तक ​​​​कि मौजूदा रसीद तालिका भी नहीं है .. वैसे भी, मुझे लगता है कि हमें बैच तालिका में क्या परवाह नहीं है, मान लीजिए कि यह सिर्फ नाम और आईडी है। आपकी रसीद तालिका में एक ही छात्र के लिए कई पंक्तियाँ हैं। इसके परिणामस्वरूप सभी जॉइन के कारण, अन्य तालिकाओं के लिए भी कई पंक्तियाँ वापस आ जानी चाहिए। इसलिए आप 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 क्लॉज में, सुनिश्चित करें कि यह इस गणना के लिए प्रासंगिक नहीं है।

पी.एस. आप कैसे नहीं जानते कि उप क्वेरी क्या है और आप इस तरह की सामग्री लिखना समाप्त कर देते हैं?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP से जावास्क्रिप्ट तक AJAX के माध्यम से सरणी पास करना

  2. sqlalchemy.orm.exc.FlushError:इंस्टेंस में एक पूर्ण पहचान कुंजी है

  3. जावा मल्टी-थ्रेडिंग का उपयोग करके mysql डेटा कैसे प्राप्त करें

  4. SQL ALTER TABLE सिंटैक्स - DBMS द्वारा सूचीबद्ध

  5. वाक्पटु कई-से-अनेक - दूर के संबंध को आसानी से कैसे लोड करें