微调查询?

Fine tune a query?

我必须列出所有 customers 和每个人放置的 number of orders - Return CustomerID, CustomerName, OrderTypeName and OrderCount CustomerName 顺序。

这是我的查询,它正在返回所需的结果。 我可以用更好的方式重写它还是正确的?

此外,我是否总是必须提供 Group by 子句中的所有字段,否则会引发错误。

SELECT c.CustomerID,
       c.CustomerName,
       ot.OrderTypeName,
       Count(o.CustomerID) OrderCount
FROM   tblCustomer c
       LEFT JOIN tblOrder o
              ON c.CustomerID = o.CustomerID
       LEFT JOIN tblOrderType ot
              ON o.OrderTypeID = ot.OrderTypeID
GROUP  BY c.CustomerID,
          c.CustomerName,
          ot.OrderTypeName
ORDER  BY c.CustomerName; 

分组是指每组一条记录。例如。假设您有 table 个订单(OrderID、CustomerID、Price)。您正在按 CustomerID 分组。假设您的 table 中有以下记录:

1 1 100
2 1 200
3 1 300
4 2 50
5 2 50

所以您有两个 customerID - 1 和 2。按 Costomer 分组意味着您将得到两行结果

1
2

所以如果你的 select 是

Select CustomerID from Orders
group by CustomerID

您可以 select CustomrerID,因为您有 2 个 CustomerID,因此可以进行分组。当selecting

Select CustomerID, Price
From Orders
Group By CustomerID

您认为 SQL 服务器将 return 作为客户 1 或 2 的价格? 对于客户 1,您有 3 个选择;对于客户 2,您有 2 个选择。SQL 服务器不知道您想要获得这些选择中的哪一个。这就是为什么您必须提供 select 语句和聚合函数,如 SUM、AVG、MIN、MAX,这将从可能的选择中产生 1 个结果。

在您的 select 中,您可以执行以下操作:

;With cte as(
Select CustomerID, OrderTypeID, Count(*) As Cnt from Order
Group by CustomerID, OrderTypeID)
Select c.CustomerID, c.CustomerName, ot.OrderTypeName, cte.Cnt from Customers c
left join cte c on cte.CustomerID = c.CustomerID
Join tblOrderType ot on cte.OrderTypeID = ot.OrderTypeID