sql >> Databáze >  >> RDS >> Mysql

MySQL SUM() dává nesprávný součet

Máte aggregate fanout issue . K tomu dochází vždy, když má primární tabulka ve výběrovém dotazu méně řádků než sekundární tabulka, ke které je připojena. Výsledkem spojení jsou duplicitní řádky. Když jsou tedy použity agregační funkce, působí na další řádky.

Zde primární tabulka odkazuje na tu, kde jsou aplikovány agregační funkce. Ve vašem příkladu
* SUM(matters.fee)>> agregace na tabulce matters .
* SUM(advicetime*advicefee)>> agregace v tabulce actions
* fixedfee='Y'>> kde podmínka v tabulce matters

Abyste se vyhnuli problému fanout:
* Vždy aplikujte agregace na nejpodrobnější tabulku ve spojení.
* Pokud dvě tabulky nemají vztah jedna ku jedné, nepoužívejte agregační funkce na pole z obě tabulky.
* Získejte své agregáty samostatně prostřednictvím různých poddotazů a poté výsledek zkombinujte. To lze provést v příkazu SQL nebo můžete exportovat data a poté to provést.

Dotaz 1:

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

Dotaz 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 netrpí fanoutem. V tomto okamžiku je můžete exportovat oba a zpracovat výsledek v php. Nebo je můžete kombinovat v 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

Nakonec SUM nebere klíčové slovo DISTINCT . DISTINCT je k dispozici pouze pro COUNT a GROUP_CONCAT agregační funkce. Následuje část neplatného SQL

SUM(DISTINCT matters.fee) AS totfixed



  1. Jak získat data za posledních 12 měsíců v MySQL

  2. Ladění výkonu databáze pro MariaDB

  3. datový typ mysql pro telefonní číslo a adresu

  4. Jak používat model strojového učení KNN s 2UDA – PostgreSQL a Orange (část 1)