下面的查询显示,从订单表中找到有托运人信息和员工信息的发货人数量。
select Count(Shipper.ShipperID),Shipper.ShipperName from [Order]
left join Shipper
on
[Order].ShipperID = Shipper.ShipperID
group by ShipperID上面的查询在groupby ShipperID上出现错误。当我将它更改为ShipperName时,它工作得很好。我得到的错误是:模棱两可的列名'ShipperID‘。
我需要弄明白为什么会这样?我无法理解在w3schools或任何其他网站。
发布于 2014-06-13 17:53:38
如果你想数一下每个发货人的订单,那么我建议你这样做
Select s.ShipperID, s.ShipperName,
(Select Count(1) From [Order] as o where o.ShipperId = s.ShipperId) as OrderCount
from Shipper as s发布于 2014-06-13 17:34:17
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需要知道在返回行时如何处理该列。
聚合函数本身的简单性是直接的,sql server只需对每一行中从该查询返回的所有值执行该操作,并返回带有标量值的单行。
但是,当select语句中有另一个不包含在聚合函数中的列名时,它将返回该列的多个行,现在如果sql server显示第一列和第二列的所有行,这将显示不准确的结果。在server抛出和错误中,您将需要按照不包含在任何聚合函数中的列对聚合函数重新调整的结果进行分组。
您的查询
如果您只选择ShipperID的计数,它将返回一个整数,显示ShipperID的计数(假设为10 ),现在当您在select语句中添加ShipperName时,结果将显示10表示count列和第二列中的所有shipperName,最后将在每个ShipperName前面显示一个类似10、10、10的结果集,这将是一个错误的计数,而且显然sql server不会执行该语句。
但是,如果在select语句中按ShipperName添加组,计数将不再显示每个ShipperName的10,而是显示每个ShipperName的计数,例如1、3、4、2等等……我希望这能帮助你理解。:)
发布于 2014-06-13 17:39:00
尝试通过ShipperName提供别名和组:因为它不包含在聚合子句中
select Count(S.ShipperID),S.ShipperName from Order O
left join Shipper S
on
O.ShipperID = S.ShipperID
group by S.ShipperNamehttps://stackoverflow.com/questions/24210873
复制相似问题