sql >> Databasteknik >  >> RDS >> Mysql

komplicerad MySQL-fråga fel resultat

Du har fortfarande inte angett fullständig information - ingen batchtabell, inte ens den ej befintliga recepttabellen. Hur som helst, jag antar att vi inte bryr oss om vad som finns i batchtabellen, låt oss säga att det bara är namnet och id. Din kvittotabell har flera rader för samma elev. Detta bör resultera i att flera rader returneras för de andra tabellerna också, på grund av alla JOINs. Därför SUMMER() flera gånger värden som bara måste summeras en gång, dvs open_balance. Det här kan vara en ledtråd om var problemet ligger, jag skulle säga att du måste flytta informationen du behöver från 'kvittotabellen till underfrågor, men jag är inte säker på att du har visat oss hela din DB. Försök att ta bort kvittotabellen från frågan och kontrollera resultaten igen. Om det är det, bör du se vad du ska göra därifrån eller åtminstone ge oss mer information.

EDIT: Frågan ska vara:

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;

Detta kommer att summera elevernas data i kvittotabellen även om den finns på mer än en rad, och returnerar bara en rad. Att ta bort kopplingen till kvittotabellen tar bort dubblettrader från de andra tabellerna, så beräkningarna borde nu vara korrekta.

En sak till - du har s.inactive = 0 i WHERE-satsen, se till att den inte är relevant för dessa beräkningar.

P.S. Hur kommer det sig att du inte vet vad en underfråga är och det slutar med att du skriver såna saker?



  1. Hur beviljar man fjärråtkomstbehörigheter till mysql-server för användare?

  2. Ta bort en ansluten användare från ett Oracle 10g-databasschema

  3. Hur hackar man MySQL GROUP_CONCAT för att hämta ett begränsat antal rader?

  4. Ändra bord utan att låsa hela bordet