Доступ к запросу из нескольких таблиц - PullRequest
0 голосов
/ 10 мая 2018

В настоящее время у меня есть база данных Access с несколькими таблицами, среди которых Order, OrderDetails и Client.

  • Заказ (OrderID, TimeStamp, FKEmployeeID, FKClientID, OrderStatus, Комментарии)
  • OrderDetails (OrderDetailsID, FKOrderID, FKProductID, количество, стоимость, общая стоимость)
  • Клиент (ClientID, Имя)

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

Пример:

Customer,  Total Orders,  Total Items
John,          5,              15
Alex,          2,              30
Ana,           1,              3

Всякий раз, когда я пытаюсь сделать запрос, Total Orders и Total Items дают мне одно и то же число.

Любая помощь будет принята с благодарностью!

Ответы [ 4 ]

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

Вам будет проще, если вы разделите задачу на несколько запросов. Я даю образец с использованием базы данных Northwind, вы можете проверить и увидеть его. Обратите внимание, что структуры и имена полей очень похожи на ваши.

Сначала создайте тот, который получает ClientId, OrderId, OrderDate и сумму количества.

SELECT c.CustomerId, o.OrderId, o.OrderDate, sum(od.Quantity) AS Qty
FROM (Customers AS c INNER JOIN Orders AS o ON c.CustomerId = o.CustomerId) 
INNER JOIN [Order Details] AS od ON o.OrderId = od.OrderID
GROUP BY c.CustomerId, o.OrderId, o.OrderDate;

Сохраните это как «OrderOfClients» (это будет сохранено в запросах). Затем создайте запрос, который использует этот запрос и запрашивает диапазон дат:

SELECT c.CustomerId, c.CompanyName, 
   Count(*) AS [Total Orders], 
   Sum(Qty) AS [Total Items]
FROM Customers AS c 
INNER JOIN OrdersOfClients AS co ON c.CustomerId = co.CustomerId
WHERE co.OrderDate Between [@startDate] And [@endDate]
GROUP BY c.CustomerId, c.CompanyName;

Вы можете сохранить его как "OrdersOfClientsSummary" и вызвать ваш отчет.

PS: По моему личному мнению, если вы используете базу данных, отличную от доступа, вы окажете себе большую услугу.

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

К сожалению, MS Access не поддерживает COUNT(DISTINCT). Вы можете сделать это с двумя агрегатами:

SELECT c.[Name], COUNT(*) As NumOrders, SUM(o.NumItems) As NumItems
FROM Client as c INNER JOIN
     (SELECT o.OrderID, o.FKClientID, COUNT(*) As NumItems 
      FROM [Order] as o INNER JOIN
           OrderDetails as od
           ON od.FKOrderID = o.OrderID
      GROUP BY o.OrderID, o.FKClientID
     ) as o
     ON o.FKClientID = c.ClientId
GROUP BY c.ClientId, c.Name;
0 голосов
/ 10 мая 2018

Это поддерживается даже с помощью MS Access:

SELECT c.Name,  
(select count(*) 
 from Orders o 
 where o. FKClientID = C.ClientID) as [Total Orders],
(select sum(Quantity) as Items 
 from OrderDetails od 
 inner join Order o on o.OrderID = od.FKOrderID
 where o.FKClientId = C.ClientID) as [Total Items]
from Client c;
0 голосов
/ 10 мая 2018

А как насчет этого решения (при этом клиенты без заказов не учитываются):

SELECT Client.[Name], 
       Count(myTotalItems.OrderID) As TotalOrders, 
       Sum(myTotalItems.TotalItems) As TotalItems
FROM Client,
    (SELECT First([Order].OrderID) As OrderID, 
            First([Order].FKClientID) As 
            ClientID, 
            Count(OrderDetails.OrderDetailsID) As TotalItems 
     FROM [Order], OrderDetails 
     WHERE OrderDetails.FKOrderID like [Order].OrderID
     GROUP BY [Order].OrderID) As myTotalItems 
WHERE myTotalItems.ClientID like Client.ClientID 
GROUP BY Client.[Name];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...