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

MySQL SUM() podając nieprawidłową sumę

Masz aggregate fanout issue . Dzieje się tak, gdy tabela podstawowa w zapytaniu wybierającym ma mniej wierszy niż tabela dodatkowa, z którą jest połączona. Wynikiem połączenia są zduplikowane wiersze. Tak więc po zastosowaniu funkcji agregujących działają one na dodatkowych wierszach.

Tutaj podstawowa tabela odnosi się do tej, w której stosowane są funkcje agregujące. W twoim przykładzie
* SUM(matters.fee)>> agregacja na tabeli matters .
* SUM(advicetime*advicefee)>> agregacja w tabeli actions
* fixedfee='Y'>> warunek where w tabeli matters

Aby uniknąć problemu z fanoutami:
* Zawsze stosuj agregacje do najbardziej szczegółowej tabeli w łączeniu.
* O ile dwie tabele nie mają relacji jeden-do-jednego, nie stosuj funkcji agregujących do pól z obie tabele.
* Uzyskaj agregacje oddzielnie za pomocą różnych podzapytań, a następnie połącz wynik. Można to zrobić w instrukcji SQL lub możesz wyeksportować dane, a następnie to zrobić.

Zapytanie 1:

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

Zapytanie 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 nie cierpieć z powodu fanoutu. W tym momencie możesz wyeksportować je oba i poradzić sobie z wynikiem w php. Możesz też połączyć je w 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

Wreszcie SUM nie przyjmuje słowa kluczowego DISTINCT . DISTINCT jest dostępny tylko dla COUNT i GROUP_CONCAT funkcje agregujące. Poniżej znajduje się fragment nieprawidłowego SQL

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. Zapytanie SUMA dla dwóch pól w dwóch różnych tabelach

  2. MySQL SELECT DISTINCT powinien uwzględniać wielkość liter?

  3. Ostrzeżenie:mysqli_connect():(28000/1045):Odmowa dostępu dla użytkownika

  4. MySQL 'Order By' - poprawne sortowanie znaków alfanumerycznych

  5. Jak zaimplementować system tagowania podobny do SO w php/mysql?