2016-03-20 2 views
0

У меня возникли проблемы с MySQL у меня есть SQL-оператор, который выглядит следующим образом:результаты SQL заявление имеют множитель для первых трех строк

Select Products.ProductID, Products.ModelNumber, Products.SerialNumber, Products.Description, Products.ListPrice, 
     Sum(OrderDetails.Quantity) AS QuantityOrdered, Sum(Inventory.Quantity) AS QuantityOnHand 

From Products 
LEFT JOIN OrderDetails USING(ProductID) 
LEFT JOIN Inventory USING(ProductID) 

group by Products.ProductID, Products.ModelNumber, Products.SerialNumber, Products.Description, Products.ListPrice; 

SQL-оператор работает отлично, за исключением первых трех строк, возвращаются, имеют множитель в столбце Sum(OrderDetails.Quantity) AS QuantityOrdered. Первая строка имеет множитель из 4, второй имеет множитель из 3, а третья строка имеет один из 2. Каждая другая строка просто отлично, а столбец Sum(Inventory.Quantity) AS QuantityOnHand возвращает правильные номера, без множителя.

Я отредактировал значения в таблице OrderDetails, которые относятся к ProdcutID, которые соответствуют первым трем рядам. Я изменил количество до 1 для каждого из них, и я получаю 4, 3 и 2 соответственно.

+0

Можете ли вы показать некоторые выборочные данные и ожидаемые результаты? – AKS

+0

У вас есть несколько строк через 'LEFT JOIN', я бы сделал ставку. – dkarp

+0

Вы создаете кросс-продукт между тремя таблицами. Поэтому он умножает 'OrderDetails.Quantity' на число строк' Inventory', которые имеют этот 'ProductID'. – Barmar

ответ

1

вам нужен отдельный счет(), попробуйте подзапрос, как это:

Select Products.ProductID, Products.ModelNumber, Products.SerialNumber, Products.Description, Products.ListPrice 
, (select Sum(Quantity) from OrderDetails where ProductID = Products.ProductID) AS QuantityOrdered 
, (select Sum(Quantity) from Inventory where ProductID = Products.ProductID) AS QuantityOnHand 
From Products 

или, если вам нужны только продукты из заказа:

Select Products.ProductID, Products.ModelNumber, Products.SerialNumber, Products.Description, Products.ListPrice 
, Sum(Quantity) AS QuantityOrdered 
, (select Sum(Quantity) from Inventory where ProductID = Products.ProductID) AS QuantityOnHand 
From Products JOIN OrderDetails USING(ProductID) 
group by Products.ProductID, Products.ModelNumber, Products.SerialNumber, Products.Description, Products.ListPrice 
+0

Первое решение там работало –

1

Вы агрегационные вдоль двух разных размеров, в результате чего Декартовое произведение инвентаря и детали заказа для каждого продукта - неудивительно, что sum() выключен.

Типичный способ решения этой проблемы является агрегирование до объединения по каждому измерению:

Select p.ProductID, p.ModelNumber, p.SerialNumber, p.Description, p.ListPrice, 
     od.QuantityOrdered, i.QuantityOnHand 
From Products p LEFT JOIN 
    (select od.ProductId, Sum(od.Quantity) as QuantityOrdered 
     from OrderDetails 
     group by od.ProductdId 
    ) od 
    USING (ProductID) LEFT JOIN 
    (select i.ProductId, Sum(Inventory.Quantity) as QuantityOnHand 
     from Inventory i 
     group by i.ProductId 
    ) i 
    USING (ProductID); 
+0

Это работает, но требует некоторого редактирования. Замена p на Продукты и такие –

+0

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