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