Я разрабатываю базу данных 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
но это не работает, поскольку я думаю, что он пропускает какие-либо одинаковые сборы (и есть несколько вопросов, которые имеют одинаковую фиксированную плату).
Я довольно новичок в этом, поэтому любая помощь будет очень желанной.
но это не работает (я думаю), это сложение вопросов. каждый раз, когда есть действие. Я также пытался сделать это …
Вы испытываете 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