SQL查询,用于计算每个客户的订单数和总美元金额

SQL查询,用于计算每个客户的订单数和总美元金额,sql,ms-access,Sql,Ms Access,我有两张桌子 订单带列: OrderID,OrderDate,CID,EmployeeID OrderID,ItemID,Quantity,SalePrice 和带有列的订单项: OrderID,OrderDate,CID,EmployeeID OrderID,ItemID,Quantity,SalePrice 我需要返回CustomerID(CID)、每个客户的订单数以及每个客户所有订单的总金额 到目前为止,我有两个不同的问题。一个给我客户订单的数量 SELECT CID, Count

我有两张桌子
订单
带列:

OrderID,OrderDate,CID,EmployeeID
OrderID,ItemID,Quantity,SalePrice
和带有列的订单项:

OrderID,OrderDate,CID,EmployeeID
OrderID,ItemID,Quantity,SalePrice
我需要返回CustomerID(CID)、每个客户的订单数以及每个客户所有订单的总金额

到目前为止,我有两个不同的问题。一个给我客户订单的数量

SELECT CID, Count(Order.OrderID) AS TotalOrders
FROM [Order]
Where CID = CID 
GROUP BY CID
Order BY Count(Order.OrderID) DESC;
另一个给我总销售额。我很难把它们结合起来

SELECT CID, Sum(OrderItem.Quantity*OrderItem.SalePrice) AS TotalDollarAmount
FROM OrderItem, [Order]
WHERE OrderItem.OrderID = [Order].OrderID
GROUP BY CID
我在Access 2010中这样做。

您可以在其他SQL引擎中使用
COUNT(DISTINCT…

SELECT CID, 
       Count(DISTINCT O.OrderID) AS TotalOrders, 
       Sum(OI.Quantity*OI.SalePrice) AS TotalDollarAmount 
FROM [Order] O
INNER JOIN [OrderItem] OI
  ON O.OrderID = OI.OrderID
GROUP BY CID 
Order BY Count(DISTINCT O.OrderID) DESC
不幸的是,该访问不支持。相反,您可以先获取订单金额,然后在计算订单数量之前加入它们:

SELECT CID,
       COUNT(Orders.OrderID) AS TotalOrders,
       SUM(OrderAmounts.DollarAmount) AS TotalDollarAmount
FROM [Orders]
INNER JOIN (SELECT OrderID, Sum(Quantity*SalePrice) AS DollarAmount 
      FROM OrderItems GROUP BY OrderID) AS OrderAmounts
  ON Orders.OrderID = OrderAmounts.OrderID
GROUP BY CID
ORDER BY Count(Orders.OrderID) DESC

如果您需要包括订单中没有项目的客户(不常见但可能),请将
内部联接更改为
左侧外部联接

创建一个查询,使用您的两个现有查询作为子查询,并在
CID
上联接两个子查询。在父查询中而不是在子查询中定义您的
订单

SELECT
    sub1.CID,
    sub1.TotalOrders,
    sub2.TotalDollarAmount
FROM
    (
        SELECT
            CID,
            Count(Order.OrderID) AS TotalOrders
        FROM [Order]
        GROUP BY CID
    ) AS sub1
    INNER JOIN
    (
        SELECT
            CID,
            Sum(OrderItem.Quantity*OrderItem.SalePrice)
                AS TotalDollarAmount
        FROM OrderItem INNER JOIN [Order]
        ON OrderItem.OrderID = [Order].OrderID
        GROUP BY CID
    ) AS sub2
    ON sub1.CID = sub2.CID
ORDER BY sub1.TotalOrders DESC;

CID=CID是怎么回事?如果客户可以下多个订单,那么对CID进行不同的计数不是更好吗?假设每个订单都有一个唯一的ID?@MgMogaki
按CID分组
完成按客户分组计数(因为CID是客户的唯一ID)。