微调查询?
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
我必须列出所有 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