`GROUP BY`如何确定使用哪种聚合方法?

时间:2016-05-03 08:43:05

标签: sql-server group-by

我暂时遇到GROUP BY错误的问题,而且令我恼火的是,最终的修复是将每个违规列添加到GROUP BY子句中。在做了一些研究后,我仍然不能完全理解为什么这会抛出一个错误,而不是给你一个非常丑陋的表,但这不是重要的部分。

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

原文:

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

修改后的版本:

GROUP BY

我相信GROUP BY子句会使用SUM(Quantity)作为它的聚合方法。它没。事实上,除了删除错误消息之外,我不知道它做了什么。

以下是输出的屏幕截图:inputParser

很明显,我对GROUP BY的理解是错误的。我相信聚合方法是由列出的列中找到的数据类型决定的。既然情况并非如此,那么DO CREATE OR REPLACE VIEW multimedia_collection AS SELECT id, name, attribute_1, attribute_2, 'MOVIES' AS media_type FROM movies UNION ALL SELECT id, name, attribute_1, attribute_2, 'MUSIC' AS media_type FROM music UNION ALL .... .... 如何运作?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

聚合方法不是由GROUP BY子句决定的。它应该在SQL中给出。第二个SQL查询只为您提供了唯一的组合,这些组合可以由GROUP BY子句列的值组成。