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