首页 > 解决方案 > 使用 LEFT JOIN 计数

问题描述

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

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

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

查询一:

    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;

但我也在想下面一个,

查询2:

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;

您推荐哪一个以及为什么?

标签: sqlsql-server

解决方案


这个查询:

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碰巧匹配CustomerIDs 的 s。

您可能打算:

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()正在返回行。每个客户至少有一行,所以价值永远不会是0。通常,您需要上一个查询。


推荐阅读