如何修复"列无效,因为它不包含在聚合函数或GROUP By子句中#34;

时间:2015-06-11 16:47:26

标签: sql sql-server

我试图从两个表中提取数据,这些表计算每个客户端的订单数量。如果S.Name中没有SELECT,下面的SQL工作正常,但我希望输出中客户端的名称比其StoreID更有意义。当我添加S.Name时,我收到以下错误:

  

专栏' uStores.Name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

SELECT O.StoreID, COUNT(O.StoreID) AS OrderCount, S.Name
FROM Orders AS O
JOIN Stores AS ON O.StoreID = S.StoreID
GROUP BY O.StoreID
ORDER BY OrderCount DESC

如何使此查询有效?

2 个答案:

答案 0 :(得分:6)

您必须在列表中包含所有非聚合列;您选择了S.Name,这不是聚合,而是GROUP BY

SELECT O.StoreID, COUNT(O.StoreID) AS OrderCount, S.Name
FROM Orders AS O
JOIN Stores AS S ON O.StoreID = S.StoreID
GROUP BY O.StoreID, S.Name -- Added "S.Name" to the GROUP BY list
ORDER BY OrderCount DESC

肥皂盒时间:group by子句的整个概念是无用的,因为它是完全确定的 - 即对于给定的选择列表只有一个有效的表达式组(忽略列表的功能相同的排列),所以为什么需要?为什么查询解析器不假设它 - 它检查它是否正确,但它只能是一件事,所以它已经完成了自己生成它所需的所有工作。

具有讽刺意味的是,关于语言的这个事实本质上打破了3NF - 即group by子句是查询本身的冗余数据(可以从查询的其他部分确定)。从数据的角度来看,如果按照自己的标准衡量,语言将被视为“设计糟糕”。

答案 1 :(得分:0)

SELECT
  O.StoreID,
  COUNT(O.StoreID) AS OrderCount,
  S.Name
FROM Orders AS O
JOIN Stores AS S
  ON O.StoreID = S.StoreID
GROUP BY O.StoreID,
         S.Name
ORDER BY OrderCount DESC

当你使用count或sum等函数时,你应该按所有字段分组,在你的情况下O.StoreID, S.Name 了解更多信息

http://www.techonthenet.com/sql_server/group_by.php

https://msdn.microsoft.com/en-us/library/ms177673.aspx