Срещате aggregate fanout issue
. Това се случва винаги, когато първичната таблица в заявка за избор има по-малко редове от вторичната таблица, към която е присъединена. Обединяването води до дублиране на редове. Така че, когато се прилагат агрегатни функции, те действат върху допълнителни редове.
Тук основната таблица се отнася до тази, където се прилагат агрегатни функции. Във вашия пример,
* SUM(matters.fee)
>> агрегирането в таблицата matters
.
* SUM(advicetime*advicefee)
>> агрегиране в таблица actions
* fixedfee='Y'
>> където условието в таблицата matters
За да избегнете проблема с разклоняването:
* Винаги прилагайте агрегатите към най-детайлната таблица в съединението.
* Освен ако две таблици нямат връзка едно към едно, не прилагайте агрегатни функции към полета от и двете таблици.
* Получете своите агрегати поотделно чрез различни подзаявки и след това комбинирайте резултата. Това може да се направи в SQL израз или можете да експортирате данните и след това да го направите.
Запитване 1:
SELECT SUM(fee) AS totfixed
FROM matters
WHERE fixedfee='Y'
Запитване 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
не страдайте от фенаут. В този момент можете да ги експортирате и двете и да се справите с резултата в php. Или можете да ги комбинирате в 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
И накрая, SUM
не приема ключова дума DISTINCT
. DISTINCT
е достъпно само за COUNT
и GROUP_CONCAT
агрегатни функции. По-долу е част от невалиден SQL
SUM(DISTINCT matters.fee) AS totfixed