由于该错误,“列在选择列表中无效,因为该列未包含在聚合函数或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列需要选择,这是否是错误的做法,并且/或者如果我将所有其他这些列都包含在分组依据中,是否会影响其余的查询?
答案 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也有许多其他行,这些列具有计算出的列,并且它不知道确切的行是什么应该选择。