Mysql
 sql >> база данни >  >> RDS >> Mysql

сложни резултати от MySQL заявка

Все още не сте предоставили пълна информация - няма таблица с партиди, дори несъществуващата таблица с рецепти.. Както и да е, предполагам, че не ни интересува какво има в таблицата с партиди, да кажем, че е само името и идентификатора. Вашата таблица с разписки има няколко реда за един и същ ученик. Това трябва да доведе до връщане на няколко реда и за другите таблици, поради всички JOIN. Следователно вие SUM() многократно стойности, които трябва да бъдат сумирани само веднъж, т.е. open_balance. Това може да е улика за това къде е проблемът, бих казал, че трябва да преместите информацията, която ви е необходима, от таблицата с разписките в подзаявки, но не съм сигурен, че сте ни показали цялата си база данни. Опитайте да премахнете таблицата с разписките от заявката и проверете резултатите отново. Ако това е всичко, трябва да видите какво да правите оттук нататък или поне да ни дадете повече информация.

РЕДАКТИРАНЕ: Заявката трябва да бъде:

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;

Това ще сумира данните за учениците в таблицата с разписки, дори ако е на повече от един ред, връщайки само един ред. Премахването на присъединяването към таблицата с разписки премахва дублиращи се редове от другите таблици, така че изчисленията вече трябва да са правилни.

Още нещо - имате s.inactive = 0 в клаузата WHERE се уверете, че не е от значение за тези изчисления.

P.S. Как така не знаеш какво е подзаявка и накрая пишеш такива неща?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Импортирайте база данни в MySQL или MariaDB

  2. Как да създадете падащо меню

  3. MySql Inner Join с клауза WHERE

  4. ИЗТРИВАНЕ на всички дублиращи се теми с няколко условия

  5. json колона срещу множество колони