Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL SUM() dando total incorreto


Você está enfrentando aggregate fanout issue . Isso acontece sempre que a tabela primária em uma consulta de seleção tem menos linhas do que uma tabela secundária à qual ela está associada. A junção resulta em linhas duplicadas. Assim, quando as funções agregadas são aplicadas, elas agem em linhas extras.

Aqui a tabela primária refere-se àquela onde as funções agregadas são aplicadas. No seu exemplo,
* SUM(matters.fee)>> agregação na tabela matters .
* SUM(advicetime*advicefee)>> agregação na tabela actions
* fixedfee='Y'>> onde a condição na tabela matters

Para evitar o problema de fanout:
* Sempre aplique as agregações à tabela mais granular em uma junção.
* A menos que duas tabelas tenham um relacionamento de um para um, não aplique funções de agregação em campos de ambas as tabelas.
* Obtenha seus agregados separadamente por meio de diferentes subconsultas e depois combine o resultado. Isso pode ser feito em uma instrução SQL ou você pode exportar os dados e fazer isso.

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

Pergunta 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 não sofra de fanout. Neste ponto, você pode exportá-los e lidar com o resultado em php. Ou você pode combiná-los em 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

Por fim, SUM não aceita uma palavra-chave DISTINCT . DISTINCT está disponível apenas para COUNT e GROUP_CONCAT funções agregadas. O seguinte é um pedaço de SQL inválido
SUM(DISTINCT matters.fee) AS totfixed