MYSQL - Сумма из нескольких столбцов в одной таблице, разделенная на одну строку в другой объединенной таблице - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть 2 таблицы для моих онлайн-заказов: product_items & order

product_item содержит selling_price , Кол-во и cost_price таблица заказов включает cost_shipping и валюта

Я хочу получить сумму всех sales_price (* qty) и cost_price (* qty) и cost_shipping для всех заказов (сгруппированных по валютам)

Проблема заключается в том, что, когда я суммирую cost_shipping , это добавляет одну cost_shipping для каждого элемента в заказе (потому что они СОЕДИНЕНЫ)

Таким образом, если в заказе 1 было 2 элемента и cost_shipping из € 10, то он вернул бы € 20.

Если я НЕ СУММАЮ cost_shipping , тогда я просто получу последнее значение

SELECT 
    currency, 
    SUM(`cost_price` * qty), 
    SUM(`selling_price` * qty), 
    SUM(cost_shipping) 
FROM `product_items` 
INNER JOIN `orders` ON `3xm_orders_new`.id = `3xm_item_sales_new`.order_id 
WHERE `date` >= '2020-02-01' AND `date` < '2020-03-01' 
GROUP BY currency

. Мне нужны эти значения для расчета поля в заказе.

Любые предложения относительно того, как я могу добиться этого?

Заранее спасибо

TempPeck

1 Ответ

1 голос
/ 07 февраля 2020

Сначала необходимо объединить затраты и цены по заказу в подзапросе, затем объединить его с заказами и агрегировать по валюте:

SELECT 
    o.currency, 
    SUM(p.cost_price) sum_cost_price,
    SUM(p.selling_price) sum_selling_price,
    SUM(cost_shipping) sum_cost_shipping
FROM (
    SELECT 
        order_id,
        SUM(cost_price * qty) cost_price, 
        SUM(selling_price * qty) selling_price, 
    FROM product_items 
    GROUP BY order_id
) p
INNER JOIN orders o ON o.id = p.order_id 
WHERE o.date >= '2020-02-01' AND o.date < '2020-03-01' 
GROUP BY o.currency

Дополнительные примечания:

  • псевдонимы таблиц облегчают написание, чтение и обслуживание запроса; Я изменил ваш код, чтобы использовать их

  • всегда квалифицировать каждый столбец в ваших запросах с таблицей, к которой он принадлежит; это намного облегчает следование логике; Я добавил квалификаторы для каждого столбца (я должен был сделать несколько предположений, а именно для столбца date)

  • , как правило, следует избегать окружать каждую таблицу и имя столбца обратными метками; они нужны только в том случае, если идентификаторы содержат специальные символы, а здесь это не так

  • в именах таблиц в исходном запросе есть несоответствия; Я использовал те, которые вы описали в вопросе

...