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
)我想我明白了,更多的经验可能会让我更清楚这一点。谢谢我将把这个标记为答案,它使事情变得更加清楚。