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