sql >> Database teknologi >  >> RDS >> Mysql

MySQL SUM() giver forkert total

Du oplever aggregate fanout issue . Dette sker, når den primære tabel i en udvalgt forespørgsel har færre rækker end en sekundær tabel, som den er forbundet til. Sammenføjningen resulterer i dublerede rækker. Så når aggregerede funktioner anvendes, virker de på ekstra rækker.

Her refererer den primære tabel til den, hvor aggregerede funktioner anvendes. I dit eksempel
* SUM(matters.fee)>> aggregering på tabel matters .
* SUM(advicetime*advicefee)>> aggregering på tabel actions
* fixedfee='Y'>> hvor betingelsen i tabellen matters

For at undgå fanout-problemet:
* Anvend altid aggregaterne på den mest granulære tabel i en joinforbindelse.
* Medmindre to tabeller har en en-til-en-relation, skal du ikke anvende aggregerede funktioner på felter fra begge tabeller.
* Få dine aggregater separat gennem forskellige underforespørgsler og kombiner derefter resultatet. Dette kan gøres i en SQL-sætning, eller du kan eksportere dataene og derefter gøre det.

Forespørgsel 1:

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

Forespørgsel 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 ikke af fanout. På dette tidspunkt kan du eksportere dem begge og håndtere resultatet i php. Eller du kan kombinere 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

Til sidst SUM tager ikke et søgeord DISTINCT . DISTINCT er kun tilgængelig for COUNT og GROUP_CONCAT aggregerede funktioner. Det følgende er et stykke ugyldig SQL

SUM(DISTINCT matters.fee) AS totfixed



  1. MySQL - Henter laveste værdi

  2. Forskellen mellem mysql_fetch_array og mysql_fetch_row?

  3. Django oracle db indstillinger

  4. mysql tjek sammenstilling af en tabel