微调查询?

时间:2015-01-18 17:05:28

标签: sql-server tsql

我必须列出所有customersnumber 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; 

1 个答案:

答案 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