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