MySQL SUM () дает неверную итоговую сумму

Я разрабатываю базу данных php / mysql. У меня есть две таблицы – вопросы и действия. Среди других полей таблица вопросов содержит «matterid» «fixedfee» и «fee». Фиксированная плата – Y или N, и гонорар может быть любым числом.

Для любого вопроса может быть несколько действий. Таблица действий содержит «actionid» 'matterid' 'advicetime' 'advicefee. Предвестник – это то, как долго длится консультация (в десятичном формате), а совет – это число. Таким образом, чтобы выработать стоимость совета по делу, я использую SUM (advicetime * advicefee).

Я хочу добавить все значения «гонорара», когда «fixedfee» = Y, а также сумма всех значений SUM (advicetime * advicefee) для всех этих вопросов.

Я пробовал использовать:

SELECT SUM(matters.fee) AS totfixed, SUM(advicetime*advicefee) AS totbills, FROM matters INNER JOIN actions ON matters.matterid = actions.matterid WHERE fixedfee = 'Y' 

но это не работает (я думаю), это сложение вопросов. каждый раз, когда есть действие. Я также попытался сделать это

 SUM(DISTINCT matters.fee) AS totfixed 

но это не работает, поскольку я думаю, что он пропускает какие-либо одинаковые сборы (и есть несколько вопросов, которые имеют одинаковую фиксированную плату).

Я довольно новичок в этом, поэтому любая помощь будет очень желанной.

Related of "MySQL SUM () дает неверную итоговую сумму"

но это не работает (я думаю), это сложение вопросов. каждый раз, когда есть действие. Я также пытался сделать это …

Вы испытываете aggregate fanout issue . Это происходит, когда первичная таблица в запросе выбора имеет меньшее количество строк, чем вторичная таблица, к которой она присоединена. Соединение приводит к дублированию строк. Таким образом, когда применяются агрегированные функции, они действуют на дополнительные строки.

Здесь основная таблица относится к той, где применяются агрегированные функции. В вашем примере,
* SUM(matters.fee) >> агрегирование по таблицам.
* 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