Mysql
 sql >> Datenbank >  >> RDS >> Mysql

komplexe MySQL-Abfrage führt zu falschen Ergebnissen

Sie haben immer noch keine vollständigen Informationen bereitgestellt - keine Stapeltabelle, nicht einmal die nicht vorhandene Rezepttabelle. Wie auch immer, ich nehme an, es ist uns egal, was in der Stapeltabelle steht, sagen wir, es sind nur der Name und die ID. Ihre Quittungstabelle enthält mehrere Zeilen für denselben Schüler. Dies sollte aufgrund der vielen JOINs dazu führen, dass auch für die anderen Tabellen mehrere Zeilen zurückgegeben werden. Daher SUM() mehrfach Werte, die nur einmal summiert werden müssen, also open_balance. Dies könnte ein Hinweis darauf sein, wo das Problem liegt. Ich würde sagen, Sie müssen die Informationen, die Sie benötigen, aus der Quittungstabelle in Unterabfragen verschieben, aber ich bin mir nicht sicher, ob Sie uns die gesamte Datenbank gezeigt haben. Versuchen Sie, die Quittungstabelle aus der Abfrage zu entfernen, und überprüfen Sie die Ergebnisse erneut. Wenn das alles ist, sollten Sie sehen, was von da an zu tun ist, oder uns zumindest weitere Informationen geben.

BEARBEITEN: Die Abfrage sollte lauten:

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;

Dadurch werden die Schülerdaten in der Quittungstabelle summiert, auch wenn sie sich in mehr als einer Zeile befinden, und es wird nur eine Zeile zurückgegeben. Durch das Entfernen der Verknüpfung mit der Quittungstabelle werden doppelte Zeilen aus den anderen Tabellen entfernt, sodass die Berechnungen jetzt korrekt sein sollten.

Eine Sache noch - Sie haben s.inactive = 0 Stellen Sie in der WHERE-Klausel sicher, dass sie für diese Berechnungen nicht relevant ist.

P.S. Wie kommt es, dass Sie nicht wissen, was eine Unterabfrage ist, und am Ende so etwas schreiben?