sql >> Database >  >> RDS >> Mysql

MySQL SUM() geeft onjuist totaal

Je ondervindt aggregate fanout issue . Dit gebeurt wanneer de primaire tabel in een selectiequery minder rijen heeft dan een secundaire tabel waaraan deze is toegevoegd. De samenvoeging resulteert in dubbele rijen. Dus wanneer geaggregeerde functies worden toegepast, werken ze op extra rijen.

Hier verwijst de primaire tabel naar de tabel waarin geaggregeerde functies worden toegepast. In uw voorbeeld,
* SUM(matters.fee)>> aggregatie op tabel matters .
* SUM(advicetime*advicefee)>> aggregatie op tabel actions
* fixedfee='Y'>> waar de voorwaarde op tafel matters

Om het fanout-probleem te voorkomen:
* Pas de aggregaties altijd toe op de meest gedetailleerde tabel in een join.
* Tenzij twee tabellen een een-op-een-relatie hebben, pas aggregatiefuncties niet toe op velden van beide tabellen.
* Verkrijg uw aggregaten afzonderlijk via verschillende subquery's en combineer vervolgens het resultaat. Dit kan worden gedaan in een SQL-instructie, of u kunt de gegevens exporteren en het vervolgens doen.

Vraag 1:

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

Vraag 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 geen last van fanout. Op dit punt kun je ze allebei exporteren en het resultaat in php verwerken. Of je kunt ze combineren in 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

Tot slot, SUM heeft geen trefwoord DISTINCT . DISTINCT is alleen beschikbaar voor COUNT en GROUP_CONCAT geaggregeerde functies. Het volgende is een stukje ongeldige SQL

SUM(DISTINCT matters.fee) AS totfixed



  1. Hoe het jaar te spellen bij het formatteren van een datum in Oracle

  2. VARCHAR versus TEKST in MySQL

  3. SET door de gebruiker gedefinieerde variabele in mysql return null?

  4. Hoe kan ik een parameter doorgeven aan een t-sql-script?