通过LEFT JOIN进行计数

时间:2019-10-03 00:35:28

标签: sql sql-server

  1. 两个名为Sales.Customers和Sales.Orders的表。

  2. Sales.Customers与列具有外键关系 在Sales.Orders中命名为CustomerID。

要求:返回所有客户的查询。查询还必须返回每个客户下的订单数。

查询1:

    SELECT  cust.cutomername,
                NumberofOrders= COUNT(ord.OrderID)
    FROM Sales.Customers Cust
                LEFT JOIN
    Sales.Orders Ord
                ON Cust.CustomerID=Ord.OrderID
    GROUP BY
           Cust.CutomerName;

但是我也在考虑下一个,

Query2:

SELECT  cust.cutomername,
            NumberofOrders= COUNT(Cust.cutomerID)
FROM Sales.Customers Cust
            LEFT JOIN
Sales.Orders Ord
            ON Cust.CustomerID=Ord.OrderID
GROUP BY
       Cust.CutomerName;

您推荐哪一个,为什么?

2 个答案:

答案 0 :(得分:2)

此查询:

SELECT c.customername, COUNT(o.OrderID)
FROM Sales.Customers c LEFT JOIN
     Sales.Orders o
     ON c.CustomerID = o.OrderID
GROUP BY c.CustomerName;

可能返回所有无意义计数的客户-可能是0,而恰好匹配OrderID的{​​{1}}除外。

您可能打算:

CustomerID

在此查询中,SELECT c.customername, COUNT(o.OrderID) FROM Sales.Customers c LEFT JOIN Sales.Orders o ON c.CustomerID = o.CustomerId GROUP BY c.CustomerName; 正在计算匹配订单的数量。对于没有订单的客户,其值可以为COUNT()

对于此查询:

0

SELECT c.customername, COUNT(c.OrderID) FROM Sales.Customers c LEFT JOIN Sales.Orders o ON c.CustomerID = o.CustomerID GROUP BY c.CustomerName; 返回的行数 。每个客户至少有一行,因此该值永远不会是COUNT()。通常,您需要上一个查询。

答案 1 :(得分:0)

也许这是您的解决方案:

select c.Customername,
    NumberOfOrders = (select count(o.OrderID) from Sales.Orders o where o.CustomerID = c.CustomerID)
from Sales.Customers c
order by c.Customername