sql >> Base de Datos >  >> RDS >> Mysql

MySQL SUM() dando un total incorrecto

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