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

MySQL SUM() дава неправилна сума

Срещате aggregate fanout issue . Това се случва винаги, когато първичната таблица в заявка за избор има по-малко редове от вторичната таблица, към която е присъединена. Обединяването води до дублиране на редове. Така че, когато се прилагат агрегатни функции, те действат върху допълнителни редове.

Тук основната таблица се отнася до тази, където се прилагат агрегатни функции. Във вашия пример,
* SUM(matters.fee)>> агрегирането в таблицата matters .
* SUM(advicetime*advicefee)>> агрегиране в таблица actions
* fixedfee='Y'>> където условието в таблицата matters

За да избегнете проблема с разклоняването:
* Винаги прилагайте агрегатите към най-детайлната таблица в съединението.
* Освен ако две таблици нямат връзка едно към едно, не прилагайте агрегатни функции към полета от и двете таблици.
* Получете своите агрегати поотделно чрез различни подзаявки и след това комбинирайте резултата. Това може да се направи в SQL израз или можете да експортирате данните и след това да го направите.

Запитване 1:

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

Запитване 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 не страдайте от фенаут. В този момент можете да ги експортирате и двете и да се справите с резултата в php. Или можете да ги комбинирате в 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

И накрая, SUM не приема ключова дума DISTINCT . DISTINCT е достъпно само за COUNT и GROUP_CONCAT агрегатни функции. По-долу е част от невалиден 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. Подреждане на MySQL резултати по IN последователност?

  2. SQL:как да подредя по поле, ако не е нула, иначе използвам друго поле

  3. MySQL :Множество реда като единичен ред, разделен със запетая

  4. Python MySql Insert не работи

  5. Издърпайте колони от извлечената таблица и ги сумирайте в един израз на MySQL SELECT