sql >> Database >  >> RDS >> Mysql

complexe MySQL-query verkeerde resultaten

Je hebt nog steeds geen volledige informatie verstrekt - geen batchtabel, zelfs de niet bestaande bonnentabel. Hoe dan ook, ik neem aan dat het ons niet kan schelen wat er in de batchtabel staat, laten we zeggen dat het alleen de naam en id is. Uw bonnentabel heeft meerdere rijen voor dezelfde leerling. Dit zou moeten resulteren in meerdere rijen die ook voor de andere tabellen worden geretourneerd, vanwege alle JOIN's. Daarom SOM() meerdere keren waarden die slechts één keer moeten worden opgeteld, d.w.z. open_balance. Dit zou een aanwijzing kunnen zijn over waar het probleem zit, ik zou zeggen dat je de informatie die je nodig hebt van 'de bonnentabel' naar subquery's moet verplaatsen, maar ik weet niet zeker of je ons je volledige DB hebt laten zien. Probeer de bonnentabel uit de query te verwijderen en controleer de resultaten opnieuw. Als dat het is, zou je moeten kijken wat je vanaf dat moment kunt doen of ons op zijn minst meer informatie moeten geven.

BEWERKEN: De vraag moet zijn:

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;

Hiermee worden de studentengegevens in de bonnentabel opgeteld, zelfs als deze op meer dan één rij staat, en wordt er slechts één rij geretourneerd. Als u de join naar de tabel met ontvangsten verwijdert, worden dubbele regels uit de andere tabellen verwijderd, dus de berekeningen zouden nu correct moeten zijn.

Nog één ding - je hebt s.inactive = 0 in de WHERE-component, zorg ervoor dat het niet relevant is voor deze berekeningen.

PS Hoe komt het dat je niet weet wat een subquery is en dat je uiteindelijk zulke dingen schrijft?



  1. Verzamelmethode:PRIOR &NEXT-functies in Oracle Database

  2. Kan geen verbinding maken met database:toegang geweigerd voor gebruiker ''@'localhost' tot database 'socialdb'

  3. mysql.connector.errors.ProgrammingError:Mislukte verwerking van formaatparameters; Python 'lijst' kan niet worden geconverteerd naar een MySQL-type

  4. Een .sql -bestand uitvoeren in MySQL