sql >> Databáze >  >> RDS >> Mysql

komplexní MySQL dotaz nesprávné výsledky

Stále jste neposkytli úplné informace - žádná tabulka dávek, dokonce ani neexistující tabulka receptů. Každopádně předpokládám, že je nám jedno, co je v tabulce dávek, řekněme, že je to jen jméno a id. Vaše tabulka účtenek má více řádků pro stejného studenta. Výsledkem by mělo být více řádků vrácených i pro ostatní tabulky, kvůli všem JOINům. Proto SUM() vícekrát hodnoty, které je třeba sečíst pouze jednou, tj. open_balance. To by mohlo být vodítkem, kde je problém, řekl bych, že musíte přesunout informace, které potřebujete, z „tabulky účtenek do dílčích dotazů, ale nejsem si jistý, zda jste nám ukázali celou svou DB. Zkuste z dotazu odebrat tabulku účtenek a znovu zkontrolujte výsledky. Pokud je to tak, měli byste vidět, co dál dělat, nebo nám alespoň poskytnout více informací.

UPRAVIT: Dotaz by měl být:

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;

Tím se sečtou data studentů v tabulce účtenek, i když je na více než jednom řádku, vrátí se pouze jeden řádek. Odebráním spojení s tabulkou účtenek odstraníte duplicitní řádky z ostatních tabulek, takže výpočty by nyní měly být správné.

Ještě jedna věc – máte s.inactive = 0 v klauzuli WHERE se ujistěte, že to není pro tyto výpočty relevantní.

P.S. Jak to, že nevíte, co je dílčí dotaz, a nakonec píšete takové věci?



  1. Jak opravit 'java.sql.SQLFeatureNotSupportedException' při použití metody createArrayOf()

  2. jak oříznout úvodní nuly z alfanumerického textu ve funkci mysql

  3. MySQL - Zatímco v klauzuli SELECT

  4. Jak můžete spustit stejný dotaz vícekrát pomocí smyčky v PL/SQL?