SQL:一旦达到唯一分组,分组依据中的列是否重要?

时间:2019-01-31 15:13:25

标签: sql sql-server group-by

由于该错误,“列在选择列表中无效,因为该列未包含在聚合函数或GROUP BY子句中。”我想知道在经过如此多的分组之后,“分组依据”中列出的列是否不再影响查询。例如,我在下面放置了一个简单的查询。

Select FlockType, FarmNo, SettleDate, Sum(Weight) as Weight, Area, Size
FROM  Table
WHERE SettlementDate BETWEEN '2018-01-01' AND '2018-02-01  
GROUP BY FlockType, FarmNo, SettleDate, Area, Size

在上述情况下,由于提到的错误,我几乎被迫在组中包括“ Area”和“ Size”,即使其中不包含我希望对其进行“分组”的任何数据。按“ FlockType”,“ FarmNo”和“ SettleDate”列分组将返回唯一记录。通过这些分组,将永​​远不会返回两个相同的记录。因此,“区域”和“大小”列是否会影响查询?假设我有100列需要选择,这是否是错误的做法,并且/或者如果我将所有其他这些列都包含在分组依据中,是否会影响其余的查询?

2 个答案:

答案 0 :(得分:2)

  

在上述情况下,由于提到的错误,我几乎被迫在组中包括“ Area”和“ Size”,即使其中不包含我希望对其进行“分组”的任何数据。按“ FlockType”,“ FarmNo”和“ SettleDate”列分组将返回唯一记录。通过这些分组,将永​​远不会返回两个相同的记录。

SQLServer不一定知道这一点,因为在将来的任何时候,都可能有超过1行参与该组。它不会去看表的定义,而是去说“哦,flocktype / farmno / settledate是表的唯一键,因此该组合永远不会超过行,所以我会让用户摆脱分组,然后添加他们喜欢的任何其他列,而无需分组/聚合函数”

为什么不这样做?可能是因为这是不必要的复杂性;作为用户,您可以体会到这一点,因此无论您执行SELECT flock, farm, settledate, x GROUP BY flock, farm, settledate, x还是执行SELECT flock, farm, settledate, max(x) GROUP BY flock, farm, settledate都无关紧要-最终结果将是相同的。通过强制您指定这种程度,即使删除了唯一键并添加了更多行,查询也将继续工作,但这是“在分组情况下不考虑唯一键”这一概念的第二种,只是为了节省您的时间。键入一些字符,因为它们不必一定要输入,并且考虑到它们可能非常复杂”

  

因此,“区域”和“大小”列会影响查询吗?

否,无论您将它们分组还是汇总,它们中只有一个,所以它们两种方式都没有区别。我也不认为您会发现明显的性能差异,因为它本质上只是“它们位于哈希表的哪一侧;作为单个键还是作为单个值?”

  

假设我有100列需要选择,这是否是错误的做法,并且/或者如果我将所有其他这些列都包含在分组依据中,是否会影响其余的查询?

您必须按列分组或将其包括在汇总中。您可以按使用的列数进行分组(但会造成混乱,因为select farm group by farm, flock, settle会产生具有相同服务器场的重复记录的负载,并且无法区分它们),但是不能按使用的列数进行分组

答案 1 :(得分:1)

为避免对某些列进行分组,但能够在SELECT语句中使用它们,则应在该列下使用聚合函数。例如:

Select 
FlockType, FarmNo, SettleDate, 
Sum(Weight) as Weight, Max(Area) MaxArea, Max(Size) MaxSize
FROM  Table
WHERE SettlementDate BETWEEN '2018-01-01' AND '2018-02-01  
GROUP BY FlockType, FarmNo, SettleDate

该错误表示您拥有Weight字段和GROUP的总和-一行,但是SQL Server也有许多其他行,这些列具有计算出的列,并且它不知道确切的行是什么应该选择。