sql >> Databasteknik >  >> RDS >> Mysql

MySQL SUM() ger felaktig summa

Du upplever aggregate fanout issue . Detta händer när den primära tabellen i en urvalsfråga har färre rader än en sekundär tabell som den är kopplad till. Sammanfogningen resulterar i dubbla rader. Så när aggregerade funktioner tillämpas, agerar de på extra rader.

Här hänvisar den primära tabellen till den där aggregerade funktioner tillämpas. I ditt exempel,
* SUM(matters.fee)>> aggregering på tabell matters .
* SUM(advicetime*advicefee)>> aggregering av tabell actions
* fixedfee='Y'>> där villkoret i tabellen matters

För att undvika problem med fanout:
* Använd alltid aggregaten på den mest granulära tabellen i en join.
* Om inte två tabeller har en en-till-en-relation, använd inte aggregatfunktioner på fält från båda tabellerna.
* Skaffa dina aggregat separat genom olika underfrågor och kombinera sedan resultatet. Detta kan göras i en SQL-sats, eller så kan du exportera data och sedan göra det.

Fråga 1:

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

Fråga 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 lider inte av fanout. Vid det här laget kan du exportera dem båda och hantera resultatet i php. Eller så kan du kombinera dem i 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

Slutligen, SUM tar inte ett nyckelord DISTINCT . DISTINCT är endast tillgänglig för COUNT och GROUP_CONCAT aggregerade funktioner. Följande är en bit av ogiltig SQL

SUM(DISTINCT matters.fee) AS totfixed



  1. Två primärnycklar specificerade i MySQL-databasen

  2. Att hämta data från RDS ger AttributeError:'sqlalchemy.cimmutabledict.immutabledict'-objektet har inget attribut 'setdefault'

  3. Tre bord går med andra än INNER JOIN

  4. Transponera en uppsättning rader som kolumner i SQL Server 2000