Доступ к SQL 2013, три таблицы, две с использованием неправильных сумм - PullRequest
0 голосов
/ 20 мая 2018

Может кто-нибудь помочь мне с этим вопросом?Я искал в интернете десятки примеров, но я просто не могу найти решение, которое работает.Я использую Access 2013. Проблема заключается в том, что я пытаюсь создать запрос, в котором будут выделены все номера деталей от поставщика, у которого есть заказы клиента или / или просроченные поставки.

Я использую три таблицы:

  1. tbl_Inventory_Master , который мне требуется номер детали , на складе, стоимость и код поставщика ,
  2. Для любых задних заказов мне нужно присоединиться к таблице t bl_Customer_Back_Order , так как мне нужно количество строк задних заказов и сумма количества задних заказов.
  3. Если поставщик имеет позднюю поставку, то мне нужно добавить таблицу tbl_On_Order , показывающую количество просроченных поставок и сумму просроченных количеств.

Запрос извлекает данные, но возвращаемое количество в два раза больше, чем должно быть.

SELECT
    I.Inventory_Part_Num, I.Description, I.On_Hand_Stock,
    COUNT (B.Part_Number) AS Back_Order_Count, SUM(B.Back_Order_Qty) as BO_Qty, 
    COUNT(O.Part_Number) AS Late_Deliveries_Count, SUM(O.Order_Qty) AS Late_Qty
FROM (tbl_Inventory_Master AS I   
LEFT OUTER JOIN tbl_Customer_Back_Order AS B
    ON I.Inventory_Part_Num = B.Part_Number)
LEFT OUTER tbl_On_Order AS O
    ON I.Inventory_Part_Num = O.Part_Number
WHERE
    I.Customer_Code = '274' AND
    O.Due_Date < [ENTER TODAYS DATE IN FORMAT DD/MM/YYYY]
GROUP BY I.Inventory_Part_Num, I.Description, I.On_Hand_Stock

Например, для номера детали 2022940 у меня должно быть10 строк обратного заказа и просроченного количества из 43. Вместо этого запрос возвращает 20 строк обратного заказа и просроченного количества суммаиз 86.

Из таблицы заказов у ​​меня есть три заказа на общую сумму 144 штуки, вместо этого запрос возвращает 960.

Может кто-нибудь посоветовать, как это сводит меня с ума?

1 Ответ

0 голосов
/ 20 мая 2018

Вы объединяетесь по несвязанным измерениям, поэтому перед объединением необходимо выполнить агрегирование:

SELECT I.Inventory_Part_Num, I.Description, I.On_Hand_Stock,
       B.Back_Order_Count, B.BO_Qty, 
       O.Late_Deliveries_Count, O.Late_Qty
FROM (tbl_Inventory_Master AS I LEFT OUTER JOIN
      (SELECT B.Part_Number, COUNT(*) as Back_Order_Count,
              SUM(B.Back_Order_Qty) as BO_Qty
       FROM tbl_Customer_Back_Order AS B
       GROUP BY B.Part_Number
      ) as B
      ON I.Inventory_Part_Num = B.Part_Number
     ) LEFT JOIN
     (SELECT O.Part_Number, COUNT(O.Part_Number) AS Late_Deliveries_Count,
             SUM(O.Order_Qty) AS Late_Qty
      FROM tbl_On_Order AS O
      WHERE O.Due_Date < [ENTER TODAYS DATE IN FORMAT DD/MM/YYYY]    
      GROUP BY O.Part_Number
      ) as O
    ON I.Inventory_Part_Num = O.Part_Number
WHERE I.Customer_Code = '274';

Обратите внимание, что внешнее агрегирование больше не требуется.

...