sql group by statement的概念

时间:2014-06-13 17:31:10

标签: sql sql-server-2008

以下查询说明,从订单表中查找包含托运人信息以及员工信息的托运人数量。

   select Count(Shipper.ShipperID),Shipper.ShipperName from [Order] 
left join Shipper
on
[Order].ShipperID =  Shipper.ShipperID
group by ShipperID

以上查询在groupby ShipperID上给出错误。当我将其更改为ShipperName时,它工作正常。 我得到的错误是:不明确的列名'ShipperID'。

我需要明白为什么会这样?我无法理解w3schools或任何其他网站。

4 个答案:

答案 0 :(得分:0)

select Count(Shipper.ShipperID),Shipper.ShipperName from [Order] 
left join Shipper
on [Order].ShipperID =  Shipper.ShipperID
group by Shipper.ShipperName 

当你在sql server的select语句中添加任何聚合函数时,Sql server知道它需要对从该查询返回的所有行执行聚合操作。

现在,当您在select查询中添加另一个列名并且它不包含在任何聚合函数中时,只需要它自己的列名。现在,当返回行时,Sql server需要知道如何处理此Column。

一个聚合函数拥有它自己的简单直接sql server只会对每行中从该查询返回的所有值执行该操作,并返回一个标量值的行。

但是当你的select语句中有另一个列名不包含在聚合函数中时,这将返回该列的多行,现在如果sql server显示第一列的SUM和第二列的所有行,这将是显示不准确的结果。有sql server抛出和错误,您将需要GROUP由您的聚合函数返回的结果由未包含在任何聚合函数中的列。

您的查询

如果您只选择ShipperID的计数,它将返回一个整数,显示ShipperID的数量,例如10,现在当您在select语句中添加ShipperName时,结果将显示类似于10的列和所有ShipperName in你的第二列,你将在每个shipperName前面得到一个类似10,10,10的结果集,这将是一个错误的计数,显然sql server将不会执行此语句。

但是如果你在select语句中添加GROUP BY ShipperName,则每个ShipperName的Count不再显示10,但每个ShipperName的COUNT类似于1,3,4,2等...... 我希望这能帮助你理解。 :)

答案 1 :(得分:0)

尝试按ShipperName提供别名和分组:因为它未包含在聚合子句中

select Count(S.ShipperID),S.ShipperName from Order O 
left join Shipper S
on
O.ShipperID =  S.ShipperID
group by S.ShipperName

答案 2 :(得分:0)

模糊错误是由于您在两个表中都有ShipperId这一事实。如果您要将其更改为Shipper.ShipperId,您最终会收到一条错误,指出Shipper.ShipperName未包含在聚合函数中,并且我没有看到您需要同时执行count()和group柱。如果您有兴趣每个Shipper id只获得一行,那么您应该做这样的事情。

  

从[订单]中选择计数(不同的Shipper.ShipperID),Shipper.ShipperName   左边加入托运人   on [Order] .ShipperID = Shipper.ShipperID   由Shipper.ShipperName

答案 3 :(得分:0)

如果您想要计算每个托运人的订单,那么我建议你做这样的事情

Select s.ShipperID, s.ShipperName,
       (Select Count(1) From [Order] as o where o.ShipperId = s.ShipperId) as OrderCount
from Shipper as s