Está experimentando un aggregate fanout issue
. Esto sucede cada vez que la tabla principal en una consulta de selección tiene menos filas que una tabla secundaria a la que está unida. La combinación da como resultado filas duplicadas. Entonces, cuando se aplican funciones agregadas, actúan en filas adicionales.
Aquí la tabla primaria se refiere a aquella donde se aplican las funciones agregadas. En su ejemplo,
* SUM(matters.fee)
>> agregación en la tabla matters
.
* SUM(advicetime*advicefee)
>> agregación en la tabla actions
* fixedfee='Y'
>> donde la condición en la tabla matters
Para evitar el problema de distribución:
* Aplique siempre los agregados a la tabla más granular en una combinación.
* A menos que dos tablas tengan una relación de uno a uno, no aplique funciones de agregado en campos de ambas tablas.
* Obtenga sus agregados por separado a través de diferentes subconsultas y luego combine el resultado. Esto se puede hacer en una instrucción SQL, o puede exportar los datos y luego hacerlo.
Consulta 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
Consulta 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
no sufras fanout. En este punto, puede exportarlos a ambos y tratar el resultado en php. O puede combinarlos en 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
Finalmente, SUM
no toma una palabra clave DISTINCT
. DISTINCT
solo está disponible para COUNT
y GROUP_CONCAT
Funciones agregadas. El siguiente es un fragmento de SQL no válido
SUM(DISTINCT matters.fee) AS totfixed