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

MySQL SUM() memberikan total yang salah

Anda mengalami aggregate fanout issue . Ini terjadi setiap kali tabel utama dalam kueri pemilihan memiliki lebih sedikit baris daripada tabel sekunder yang digabungkan. Gabung menghasilkan baris duplikat. Jadi, ketika fungsi agregat diterapkan, mereka bertindak pada baris tambahan.

Di sini tabel utama mengacu pada tabel di mana fungsi agregat diterapkan. Dalam contoh Anda,
* SUM(matters.fee)>> agregasi pada tabel matters .
* SUM(advicetime*advicefee)>> agregasi pada tabel actions
* fixedfee='Y'>> di mana kondisi pada tabel matters

Untuk menghindari masalah fanout:
* Selalu terapkan agregat ke tabel paling granular dalam gabungan.
* Kecuali dua tabel memiliki hubungan satu-ke-satu, jangan terapkan fungsi agregat pada bidang dari kedua tabel.
* Dapatkan agregat Anda secara terpisah melalui subkueri yang berbeda, lalu gabungkan hasilnya. Ini dapat dilakukan dalam pernyataan SQL, atau Anda dapat mengekspor data lalu melakukannya.

Pertanyaan 1:

SELECT SUM(fee) AS totfixed 
FROM matters 
WHERE fixedfee='Y'

Pertanyaan 2:

SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
FROM matters  
JOIN actions ON matters.matterid = actions.matterid 
WHERE matters.fixedfee = 'Y'

Query 1 &Query 2 tidak menderita fanout. Pada titik ini Anda dapat mengekspor keduanya dan menangani hasilnya di php. Atau Anda dapat menggabungkannya dalam SQL:

SELECT query_2.totbills, query_1.totfixed
FROM (SELECT SUM(fee) AS totfixed 
    FROM matters 
    WHERE fixedfee='Y') query_1,

    (SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
    FROM matters  
    JOIN actions ON matters.matterid = actions.matterid 
    WHERE matters.fixedfee = 'Y') query_2

Terakhir, SUM tidak menggunakan kata kunci DISTINCT . DISTINCT hanya tersedia untuk COUNT dan GROUP_CONCAT fungsi agregat. Berikut ini adalah bagian dari SQL yang tidak valid

SUM(DISTINCT matters.fee) AS totfixed



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL SELECT Satu-ke-Banyak menjadi satu baris

  2. mysql menggabungkan hasil kueri secara berdampingan

  3. Apakah indeks MySql normal diperlukan ketika kami memiliki indeks Komposit?

  4. Menggunakan mysqldump untuk memformat satu sisipan per baris?

  5. Cara Meningkatkan Kinerja MySQL AWS 2X Lebih Dari Amazon RDS dengan Biaya Yang Sama