我必须列出所有customers
和number of orders
- 以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;
答案 0 :(得分:0)
分组意味着您将获得每组一条记录。例如。考虑您有表订单(OrderID,CustomerID,Price)。您正在按CustomerID进行分组。假设您的表中有以下记录:
1 1 100
2 1 200
3 1 300
4 2 50
5 2 50
所以你有两个customerID - 1 AND 2.按Costomer分组意味着你会得到两行
1
2
所以,如果你的选择是
Select CustomerID from Orders
group by CustomerID
您可以选择CustomrerID,因为您有2个CustomerID,因此也可以进行分组。选择
时Select CustomerID, Price
From Orders
Group By CustomerID
您认为SQL Server将作为客户1或2的价格返回什么? 客户1有2个选择,客户2有2个选择.SQL Server不知道您想要获得哪个选项。这就是为什么你必须提供带有SUM,AVG,MIN,MAX等聚合函数的select语句,它将从可能的选择中产生1个结果。
在您的选择中,您可以执行以下操作:
;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