Mysql
 sql >> Database >  >> RDS >> Mysql

query MySQL complesse risultati errati

Non hai ancora fornito informazioni complete:nessuna tabella batch, anche la tabella delle ricevute non esistente. Ad ogni modo, presumo che non ci importi cosa c'è nella tabella batch, diciamo che è solo il nome e l'ID. La tabella delle ricevute ha più righe per lo stesso studente. Ciò dovrebbe comportare la restituzione di più righe anche per le altre tabelle, a causa di tutti i JOIN. Pertanto SUM() più volte i valori che devono essere sommati solo una volta, ovvero open_balance. Questo potrebbe essere un indizio su dove sia il problema, direi che devi spostare le informazioni di cui hai bisogno dalla "tabella delle ricevute nelle sottoquery, ma non sono sicuro che tu ci abbia mostrato l'intero DB. Prova a rimuovere la tabella delle ricevute dalla query e controlla di nuovo i risultati. Se è così, dovresti vedere cosa fare da lì in poi o almeno fornirci maggiori informazioni.

MODIFICA: La query dovrebbe essere:

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;

Questo sommerà i dati degli studenti nella tabella delle ricevute anche se si trova su più di una riga, restituendo solo una riga. La rimozione del join alla tabella delle ricevute rimuove le righe duplicate dalle altre tabelle, quindi i calcoli dovrebbero ora essere corretti.

Un'altra cosa:hai s.inactive = 0 nella clausola WHERE, assicurati che non sia rilevante per questi calcoli.

PS Come mai non sai cos'è una query secondaria e finisci per scrivere cose del genere?