Sql server “分组依据”如何确定使用哪种聚合方法?

Sql server “分组依据”如何确定使用哪种聚合方法?,sql-server,group-by,Sql Server,Group By,我一直在使用时遇到问题。“列'examplecolumn'在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。”错误已经有一段时间了,让我非常恼火的是,最终的解决方法是将所有有问题的列添加到GROUP BY子句中。在做了一些研究之后,我仍然不完全明白为什么这会抛出一个错误,而不是给你一个非常难看的表格,但这不是重要的部分 重要的是,根据我的研究,groupby根据传递给它的列合并相同的行。选择适当的方法将数据添加到一起。出于好奇,我复制了现有的查询并做了一个小改动。如

我一直在使用
时遇到问题。“列'examplecolumn'在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。”
错误已经有一段时间了,让我非常恼火的是,最终的解决方法是将所有有问题的列添加到
GROUP BY
子句中。在做了一些研究之后,我仍然不完全明白为什么这会抛出一个错误,而不是给你一个非常难看的表格,但这不是重要的部分

重要的是,根据我的研究,
groupby
根据传递给它的列合并相同的行。选择适当的方法将数据添加到一起。出于好奇,我复制了现有的查询并做了一个小改动。如果我对GROUP BY works的理解是正确的,它应该给我相同的输出:

原件:

SELECT [ProductName]
   ,[CompanyName]
   ,[CategoryID] AS 'CategoryName'
   ,SUM(Quantity) AS 'Total Ordered'
FROM [Order Details] AS t1
INNER JOIN Products AS t2
   ON t1.ProductID = t2.ProductID
INNER JOIN Suppliers AS t3
   ON t2.SupplierID = t3.SupplierID
GROUP BY ProductName, CategoryID, CompanyName
修改后的版本:

SELECT [ProductName]
   ,[CompanyName]
   ,[CategoryID] AS 'CategoryName'
   ,Quantity AS 'Total Ordered'
FROM [Order Details] AS t1
INNER JOIN Products AS t2
   ON t1.ProductID = t2.ProductID
INNER JOIN Suppliers AS t3
   ON t2.SupplierID = t3.SupplierID
GROUP BY ProductName, CategoryID, CompanyName, Quantity
我相信
GROUPBY
子句将使用SUM(数量)作为其聚合方法。事实并非如此。事实上,除了删除错误消息,我不确定它做了什么

以下是输出的屏幕截图:


很明显,我对
groupby
的理解是错误的。我相信聚合方法是由在所列列列中找到的数据类型决定的。既然不是这样,
groupby
是如何工作的?

聚合方法不是由groupby子句决定的。它应该用SQL给出。第二个SQL查询只提供了唯一的组合,这些组合可以由GROUPBY子句的列值构成。

聚合方法不是由GROUPBY子句决定的。它应该用SQL给出。第二个SQL查询只提供唯一的组合,这些组合可以由GROUPBY子句的列值构成。

GROUPBY
表示将不聚合的列。因此,这些列中的每个值的唯一组合将产生一行输出


您希望输出中的所有剩余列都需要在聚合中—但这是错误消息告诉您的—它希望您告诉服务器哪个聚合是合适的。

GROUP BY
表示将不聚合的列。因此,这些列中的每个值的唯一组合将产生一行输出


您希望在输出中包含的所有剩余列都需要在聚合中—但这是错误消息告诉您的—它希望您告诉服务器哪个聚合是合适的。

稍微相切一点,这一要求是将
GROUP BY
中的所有未聚合列都包含在内,即使我已经按照同一个表的主键进行分组,这也是我对SQL最恼火的地方之一。这很乏味,它模糊了分组的意图,并且通过不必要地复制信息和混乱查询,使得下一个编辑查询的人更有可能引入微妙的错误。数据库可以很好地从关键约束中看出,这些列在一个组中永远不会有多个值;它不应该要求我重复地指定它。@IlmariKaronen-现在我很好奇-如果你是
GROUP
ing一组已知的不同的列,你在计算什么聚合?通常,在另一个表上,它与我分组的主键的表有多对一的关系。类似于
选择CompanyId、CompanyName、COUNT(EmployeeId)作为EmployeeCount,companys的网站URL使用(CompanyId)GROUP BY CompanyId加入员工,其中
CompanyId
companys
表的主键。(当然,这个查询在SQL Server上会失败,因为我遗漏了
GROUP BY
中多余的
CompanyName
WebsiteURL
)我想我明白了,更多的经验可能会让我更清楚这一点。谢谢我会将此标记为答案,它使事情变得更加清楚。稍微相切一点,在
GROUP BY
中包含每个未聚合列的要求,即使我已经按照同一个表的主键进行了分组,也是我对SQL的一个不满。这很乏味,它模糊了分组的意图,并且通过不必要地复制信息和混乱查询,使得下一个编辑查询的人更有可能引入微妙的错误。数据库可以很好地从关键约束中看出,这些列在一个组中永远不会有多个值;它不应该要求我重复地指定它。@IlmariKaronen-现在我很好奇-如果你是
GROUP
ing一组已知的不同的列,你在计算什么聚合?通常,在另一个表上,它与我分组的主键的表有多对一的关系。类似于
选择CompanyId、CompanyName、COUNT(EmployeeId)作为EmployeeCount,companys的网站URL使用(CompanyId)GROUP BY CompanyId加入员工,其中
CompanyId
companys
表的主键。(当然,这个查询在SQL Server上会失败,因为我遗漏了
GROUP BY
中多余的
CompanyName
WebsiteURL
)我想我明白了,更多的经验可能会让我更清楚这一点。谢谢我将把这个标记为答案,它使事情变得更加清楚。