Mysql
 sql >> Baza danych >  >> RDS >> Mysql

złożone zapytanie MySQL błędne wyniki

Nadal nie podałeś pełnych informacji - nie ma tabeli partii, nawet nieistniejącej tabeli odbiorów. W każdym razie zakładam, że nie obchodzi nas, co jest w tabeli partii, powiedzmy, że to tylko nazwa i identyfikator. Twoja tabela rachunków zawiera wiele wierszy dla tego samego ucznia. Powinno to spowodować zwrócenie wielu wierszy również dla innych tabel ze względu na wszystkie sprzężenia. Dlatego sumujesz () wiele razy wartości, które muszą być zsumowane tylko raz, tj. open_balance. To może być wskazówka, gdzie jest problem, powiedziałbym, że musisz przenieść potrzebne informacje z „tabeli rachunków do podzapytań, ale nie jestem pewien, czy pokazałeś nam całą bazę danych. Spróbuj usunąć tabelę wpływów z zapytania i ponownie sprawdź wyniki. Jeśli to wszystko, powinieneś zobaczyć, co dalej robić lub przynajmniej podać nam więcej informacji.

EDYTUJ: Zapytanie powinno brzmieć:

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;

Spowoduje to zsumowanie danych uczniów w tabeli rachunków, nawet jeśli znajdują się one w więcej niż jednym wierszu, zwracając tylko jeden wiersz. Usunięcie sprzężenia z tabelą wpływów usuwa zduplikowane wiersze z innych tabel, więc obliczenia powinny być teraz poprawne.

Jeszcze jedno - masz s.inactive = 0 w klauzuli WHERE upewnij się, że nie ma to znaczenia dla tych obliczeń.

PS Jak to się dzieje, że nie wiesz, co to jest zapytanie podrzędne i piszesz takie rzeczy?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaznaczanie wszystkich pól poza jednym polem w mysql

  2. Błąd duplikatu klucza MySQL powoduje ustawioną blokadę współdzieloną dla zduplikowanego rekordu indeksu?

  3. Jak sprawdzić, czy data jest pomiędzy date1 a date2 za pomocą mysql?

  4. Wstaw wiele wierszy z przygotowanymi oświadczeniami PDO

  5. Spróbuj złapać MySQL