MYSQL Подсчет групп по строкам без учета влияния полей JOIN и SUM на объединенные таблицы - PullRequest
1 голос
/ 25 августа 2011

У меня есть 3 таблицы:

Orders
- id
- customer_id

Details
- id
- order_id
- product_id
- ordered_qty

Parcels
- id
- detail_id
- batch_code
- picked_qty

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

Ряд сведений содержит несколько посылок, так как может поступить 10 000 заказанных штукиз 6 разных партий, поэтому товары из партий упаковываются и отправляются отдельно.Выбранное количество, помещенное в каждую посылку для строки подробностей, должно быть таким же, как order_qty.

... надеюсь, что это имеет смысл.

Я изо всех сил пытаюсь написать запрос, чтобы предоставить сводную информациювсего этого.

Мне нужно сгруппировать по customer_id, чтобы предоставить строку данных для каждого клиента.

Эта строка должна содержать

  • Их общее количество заказов.
  • Общее количество заказанных им товаров по всем заказам
  • Общее количество выбранных товаров по всем заказам

Я могу получить первый с:

SELECT customer_id, COUNT(*) as number_of_orders 
FROM Orders 
GROUP BY Orders.customer_id

Но когда я ЛЕВО СОЕДИНЯЮСЬ две другие таблицы и добавляю

SELECT ..... SUM(Details.ordered_qty) AS total_qty_ordered, 
SUM(Parcels.picked_qty) AS total_qty_picked

.., тогда я получаю результаты, которые не суммируются с количествами, и COUNT (*), кажется, включаетдополнительные строки из JOIN, которые, очевидно, больше не дают мне количество ордеров.

Не уверен, что делать дальше.===== РЕДАКТИРОВАТЬ =======

Вот запрос, который я пробовал:

SELECT 
  customer_id, 
  COUNT(*) as number_of_orders, 
  SUM(Details.ordered_qty) AS total_qty_ordered, 
  SUM(Parcels.picked_qty) AS total_qty_picked 
FROM Orders
LEFT JOIN Details ON Details.order_id=Order.id
LEFT JOIN Parcels ON Parcels.detail_id=Detail.id 
GROUP BY Orders.customer_id

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

попробуй COUNT(distinct Orders.order_id) as number_of_orders, как в

SELECT 
  customer_id, 
  COUNT(distinct Orders.order_id) as number_of_orders, 
  SUM(Details.ordered_qty) AS total_qty_ordered, 
  (select SUM(Parcels.picked_qty) 
    FROM Parcels WHERE Parcels.detail_id=Detail.id ) AS total_qty_picked 
FROM Orders
LEFT JOIN Details ON Details.order_id=Order.id    
GROUP BY Orders.customer_id

РЕДАКТИРОВАТЬ: добавлен другой выбор с подвыбором

0 голосов
/ 25 августа 2011

Есть ли какая-то конкретная причина, по которой вы чувствуете необходимость объединить все это в одном запросе? Упростите его, разбив его на отдельные запросы, и, если вы хотите, чтобы результаты вызывались одним вызовом, поместите запросы в хранимую процедуру, используя временные таблицы.

...