发生什么事情弄乱了我的GROUP BY查询?

时间:2012-07-23 14:45:46

标签: sql-server query-optimization

这是我的查询:

select top 60 * from ABC_Sessions (nolock)   
where EntryDate > '06-22-2012 23:59:59'
GROUP BY TargetedID

然后它给了我这个错误:

  

消息8120,级别16,状态1,行1列'BI_Sessions.SessionID'是   在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

4 个答案:

答案 0 :(得分:6)

查询中的*会扩展到表格中的所有列。

select top 60 TargetedID, SessionID, ...
from ABC_Sessions (nolock)
where EntryDate > '06-22-2012 23:59:59'
GROUP BY TargetedID 

正如错误消息所述,没有聚合函数(例如SessionID)选择MAX无效。

这样可行:

select top 60 TargetedID, MAX(SessionID) AS MaxSessionID
from ABC_Sessions (nolock)
where EntryDate > '06-22-2012 23:59:59'
GROUP BY TargetedID 

答案 1 :(得分:1)

您使用了明星*,但没有使用abc_sessions表中的列。 使用没有任何聚合函数的GROUP BY对我来说很奇怪。

你想看到什么?

答案 2 :(得分:1)

这是一个理论问题:正如错误所说,你不能选择你没有掌握的东西。 因此,当您使用简单的SELECT / FROM / WHERE查询时,您在FROM表中拥有的所有内容都可以选择。

但是如果你使用GROUP BY,你就会缩小你的观点:你在GROUP BY中没有使用的任何东西都被丢弃了(想想它两次,当你明确要求时从几行中选择数据是没有意义的将这些行分组。)

也许你会混淆GROUP BYORDER BY

答案 3 :(得分:0)

您收到此错误的原因是您没有使用sum / average / count / max / min或您的select语句中的任何类似函数。一旦你使用它们中的任何一个,你将不会得到这个错误。例如:
选择前60名TargetedID,MAX(EntryDate) 来自ABC_Sessions(nolock) 其中EntryDate> '06 -22-2012 23:59:59' GROUP BY TargetedID