对三个表的SQL查询返回聚合答案

时间:2014-09-28 07:16:28

标签: sql sql-server

问:对于每个客户列表,客户ID和下订单总数。

我相信我可以用这三个表执行此查询

Customer_T                              Order_T                  OrderLine_T
+------+------+------+-  +---------+-----------+-------+   +---------+-----------------+
|CustID| CNAME | Addr |  | OrderID | OrderDate |CustID |   |OrderID  | OrderedQuantity |
+------+------+------+   +-------+----+--------+-------+   +---------+-----------------+

我尝试了几个查询,这是我最新的迭代,返回错误Customer_T.CustomerID无效,因为它不包含在聚合函数或group by子句中。

SELECT 
   Customer_T.CustomerID, Order_T.OrderID
FROM 
   Customer_T, Order_T, OrderLine_T
WHERE 
   Order_T.CustomerID=Customer_T.CustomerID
   AND Order_T.OrderID=OrderLine_T.OrderID
ORDER BY 
   COUNT(OrderLine_T.OrderedQuantity)

我不知道该去哪里......我应该使用Join运算符吗?

编辑:我应该提到需要从Customer_T表中提取额外的CustID是b / c有些客户没有购买任何东西而且没有包含在订单表中(对于每个客户)。

5 个答案:

答案 0 :(得分:0)

这可以帮助你得到正确答案。

SELECT ord.CustID, count(ord.CustID) AS OrderCount, cust.CNAMR
FROM Customer_T cust JOIN Order_T ord
    ON ( ord.CustomerID=cust.CustomerID)
    JOIN  OrderLine_T ordLine
    ON ( ord.OrderID=ordLine.OrderID)
GROUP BY ord.CustID ORDER BY OrderCount Desc

但在这里获取订单数量会比较棘手。

答案 1 :(得分:0)

这就是你需要的。

SELECT C.CustID, COUNT(OL.OrderedQuantity) 
FROM Customer_T C 
   JOIN Order_T O ON(O.OrderID=C.CustID)
   JOIN OrderLine_T OL ON(O.OrderID = OL.OrderID)
GROUP BY C.CustID

答案 2 :(得分:0)

由于您只需要“...列出CustomerID和下达的订单总数”,您不需要加入任何其他表,所有信息都可以在Order_T表中找到:

SELECT CustID, COUNT(OrderID) AS OrderCount
FROM Order_T
GROUP BY CustID

如果您想显示客户的姓名,则需要加入表格。

答案 3 :(得分:0)

试试这个

SELECT 
    C.CustID, 
    SUM(CASE O.OrderID WHEN NULL THEN 0 ELSE 1 END) AS NumberOfOrdersPlaced
FROM Customer_T C 
    LEFT JOIN Order_T O ON (O.CustID = C.CustID)
GROUP BY C.CustID

上述查询将返回为每位客户下达的订单数量。如果客户尚未下订单,则NumberOfOrdersPlaced列的值将为0.

答案 4 :(得分:0)

对于每个客户列表,客户ID和下订单总数

这只需要2个表(客户和订单)

SELECT
      Customer_T.CustomerID
    , COUNT(Order_T.OrderID) orders_per_customer
FROM Customer_T
LEFT OUTER JOIN Order_T ON Customer_T.CustomerID = Order_T.CustomerID
GROUP BY
      Customer_T.CustomerID
ORDER BY
      Customer_T.CustomerID
;

请注意LEFT OUTER JOIN的使用,此连接类型允许返回Customer_T中的所有记录,即使他们尚未下订单。我建议您访问here for a visual representation of SQL joins

您可以添加第三个表以获取其他信息,但您需要注意不要夸大订单数量,因为每个订单的订单项意味着一对多关系(单个订单项很多)订购)。您可以通过引入COUNT(DISTINCT ...)

来实现此目的
SELECT
      Customer_T.CNAME
    , Customer_T.CustomerID
    , COUNT(DISTINCT Order_T.OrderID)  orders_per_customer
    , SUM(OrderLine_T.OrderedQuantity) sum_of_quantity
FROM Customer_T
LEFT OUTER JOIN Order_T ON Customer_T.CustomerID = Order_T.CustomerID
LEFT OUTER JOIN OrderLine_T ON  Order_T.OrderID = OrderLine_T.OrderID
GROUP BY
      Customer_T.CNAME
    , Customer_T.CustomerID
ORDER BY
      Customer_T.CNAME
    , Customer_T.CustomerID
;

请注意,数量之和不是一个非常有意义的指标,它只是作为方法的证明。