Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

kueri MySQL yang kompleks hasil yang salah

Anda masih belum memberikan informasi lengkap - tidak ada tabel batch, bahkan tabel penerimaan yang tidak ada .. Bagaimanapun, saya menganggap kita tidak peduli apa yang ada di tabel batch, katakanlah itu hanya nama dan id. Tabel tanda terima Anda memiliki beberapa baris untuk siswa yang sama. Ini akan menghasilkan beberapa baris yang dikembalikan untuk tabel lain juga, karena semua GABUNG. Oleh karena itu Anda SUM() beberapa kali nilai yang harus dijumlahkan hanya sekali, yaitu open_balance. Ini bisa menjadi petunjuk di mana masalahnya, saya akan mengatakan Anda harus memindahkan info yang Anda butuhkan dari 'tabel tanda terima ke subkueri, tetapi saya tidak yakin Anda telah menunjukkan kepada kami keseluruhan DB Anda. Coba hapus tabel tanda terima dari kueri dan periksa kembali hasilnya. Jika itu saja, Anda harus melihat apa yang harus dilakukan dari sana atau setidaknya memberikan lebih banyak info kepada kami.

EDIT: Kuerinya harus:

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;

Ini akan menjumlahkan data siswa di tabel tanda terima meskipun ada di lebih dari satu baris, mengembalikan hanya satu baris. Menghapus gabungan ke tabel tanda terima menghapus baris duplikat dari tabel lain, jadi perhitungannya sekarang harus benar.

Satu hal lagi - Anda punya s.inactive = 0 di klausa WHERE, pastikan itu tidak relevan dengan perhitungan ini.

P.S. Kenapa Anda tidak tahu apa itu sub query dan Anda akhirnya menulis hal-hal seperti itu?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Waktu kueri MySQL habis:(70100):Eksekusi kueri terputus

  2. Kutipan tunggal, Kutipan ganda, dan Backtick di MySQL

  3. PHP Mysql PDO:Kesalahan umum:Server MySQL 2006 telah hilang

  4. [MySQL]:Apa itu metode pengumpulan?

  5. Tambahkan kolom di laravel