У меня есть таблица поставок и таблицы заказов. Несколько заказов могут быть связаны с доставкой. Несколько дней назад я спросил question о том, как получить сумму суммы заказа за конкретную доставку и быстро показала, как это сделать. (Спасибо еще раз за это.)SUM и GROUP BY вопросы
Теперь мы добавили таблицу расчетов, а также, как и заказы, может быть несколько поселений, связанных с одной доставкой (через идентификатор доставки, точно так же, как с заказами), и я пытаясь получить сумму своих значений. Я полагал, что использую ту же стратегию и LEFT JOIN в таблице расчетов, но проблема в том, что когда есть только одно урегулирование, связанное с конкретной доставкой, SUM (s.amount) возвращает двойное фактическое значение.
Я пробовал играть с GROUP BY безрезультатно. Может ли кто-нибудь показать мне, что я делаю неправильно?
Заранее благодарен!
PS: это вопрос, я с помощью, которая возвращает двойные значения суммы расчетов, когда есть только один населенный пункт:
SELECT
d.id,
SUM(o.goods_amount) AS amount,
SUM(s.amount) AS settlementAmount,
FROM delivery d
LEFT JOIN order o
ON d.id = o.delivery_id
LEFT JOIN settlement s
ON d.id = s.delivery_id
WHERE d.id = *deliveryId*
GROUP BY d.id;
Наиболее вероятным объяснением является частичный крест продукта. Одна строка от поселения согласовывается с несколькими рядами от доставки и/или заказа. Затем, когда выполняется агрегация, из поселения имеется несколько копий строки. Удалите агрегаты GROUP BY и SUM, запустите запрос, и вы увидите, что происходит. – spencer7593
Я попытался выполнить запрос gthe без GROUP BY AND SUM и был протестирован при поставке с 2 заказами и 1 поселением. Как вы сказали, он возвращает 2 строки, один с order_amount order1 и sett_amount, а другой с order_amount order2 и тот же расчет_база. Поэтому это объясняет, почему СУММ дает мне двойную ценность. Есть ли способ обойти это? – Feanor
Один из подходов - выполнять агрегацию (SUM) из каждой таблицы отдельно, в виде отдельных запросов. Чтобы объединить их, оберните каждый из запросов в parens, а затем используйте весь подзапрос вместо ссылки на таблицу в другом запросе. – spencer7593