Сложный запрос с множеством объединений - PullRequest
2 голосов
/ 18 ноября 2011

Я пытаюсь сделать один запрос, чтобы получить статистические данные из базы данных.

Структура моих таблиц описана здесь:

PRODUCTS
id | price | buy_price | vendor_code | ...

ORDERS
id | shipping_method_id | ...

ORDER_ITEMS
id | order_id | product_id | quantity | ...

SHIPPING_METHODS
id | cost | ...

SUPPLIERS
id | code | ...

Я хочу получить такие данные. Словом, я делаю отчеты об общем доходе Продукта, расходах и количестве покупок в моей электронной торговле и хочу, чтобы они группировались по поставщикам. Я написал этот sql:

SELECT orders.id,
suppliers.code,
COUNT(products.id)*items.quantity buys,
SUM(products.price*items.quantity + shipping_methods.cost) sales,
SUM(products.buy_price*items.quantity) expenses
FROM `orders` orders
INNER JOIN `order_items` items ON items.order_id = orders.id
INNER JOIN `products` products ON items.product_id = products.id
INNER JOIN (SELECT DISTINCT suppliers.code FROM `suppliers`) suppliers
    ON products.vendor_code LIKE CONCAT(suppliers.code, '%%')
INNER JOIN `shipping_methods` shipping_methods ON orders.shipping_method_id = shipping_methods.id
WHERE (
    orders.delivery_date_to BETWEEN '2011-11-18' AND '2011-11-19'
)
GROUP BY suppliers.code, orders.id
ORDER BY buys DESC

это возвращает мне эти данные:

order_id    code    buys    sales   expenses
85          SB      4       1504    1111.32
84          VD      2       496     350.82
60          lg      2       1418    1052.31
88          SB      1       376     277.83

Когда я изменяю GROUP BY suppliers.code, orders.id на GROUP BY suppliers.code, он возвращает почти правильные данные, я имею в виду данные, сгруппированные по коду, но подсчет неверен. Признайте, что продажи и расходы правильные

order_id    code    buys    sales   expenses
85          SB      8       1880    1389.15
60          lg      2       1418    1052.31
84          VD      2       496     350.82

Если вы видите, что SB насчитал 8 продаж, но на самом деле их всего 5, как вы можете видеть в предыдущей таблице. Я уверен, что что-то пропустил в своем запросе, но не могу понять, как это исправить.

PS поле order_id не используется в моих дальнейших сценариях, я использую его, потому что запрос django Model.objects.raw () действительно должен иметь первичный ключ в результате, не очень понимаю, почему

1 Ответ

1 голос
/ 18 ноября 2011

Попробуйте этот запрос.

SELECT t1.code, SUM(t1.buys), SUM(t1.sales) FROM (
SELECT orders.id, 
suppliers.code, 
COUNT(products.id)*items.quantity buys, 
SUM(products.price*items.quantity + shipping_methods.cost) sales, 
SUM(products.buy_price*items.quantity) expenses 
FROM `orders` orders 
INNER JOIN `order_items` items ON items.order_id = orders.id 
INNER JOIN `products` products ON items.product_id = products.id 
INNER JOIN (SELECT DISTINCT suppliers.code FROM `suppliers`) suppliers 
    ON products.vendor_code LIKE CONCAT(suppliers.code, '%%') 
INNER JOIN `shipping_methods` shipping_methods ON orders.shipping_method_id = shipping_methods.id 
WHERE ( 
    orders.delivery_date_to BETWEEN '2011-11-18' AND '2011-11-19' 
) 
GROUP BY suppliers.code, orders.id 
ORDER BY buys DESC 
) AS t1
GROUP BY t1.code

Редактировать: Я забыл SUM () частей. Просто добавьте, пожалуйста, повторите попытку, если вы уже пробовали.

...