2012-07-23 47 views
0

這是我的查詢:發生了什麼,弄亂了我的GROUP BY查詢?

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

然後它給了我這個錯誤:

Msg 8120, Level 16, State 1, Line 1 Column 'BI_Sessions.SessionID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

+6

不能使用SELECT *與通過...分組。如果你選擇所有的行,你能解釋一下這個小組應該是什麼意思嗎?如果您有兩行具有相同的TargetedID,那麼您希望EntryDate和其他列的行是什麼?請顯示示例數據和所需結果,而不是您嘗試的無效查詢以及它應該返回的錯誤。 – 2012-07-23 14:48:24

+1

你的問題是什麼?這個錯誤信息對我來說似乎很清楚。 – 2012-07-23 14:52:09

回答

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 
+0

非常感謝Mark - 這清除了它! – Coffee 2012-07-23 14:59:47

1

您從abc_sessions表中使用明星*而不是GROUP BY列。 使用GROUP BY沒有任何聚合函數看起來很奇怪。

你想看什麼?

1

這是一個理論問題:正如錯誤所述,你不能選擇你沒有處理的東西。 因此,當您使用簡單的SELECT/FROM/WHERE查詢時,您在FROM表中的所有內容都可以讓您選擇。

但是,如果您使用GROUP BY,則會縮小視圖:在GROUP BY中沒有使用的任何內容都會被丟棄(想想兩次,當您明確詢問時從多行中選擇數據是沒有意義的將這些行分組)。

也許你很困惑GROUP BYORDER BY

0

你得到這個錯誤的原因是因爲你沒有在你的select語句中使用sum/average/count/max/min或任何類似的函數。一旦你使用它們中的任何一個,你都不會得到這個錯誤。例如:
選擇前60名TargetedID,MAX(EntryDate) 從ABC_Sessions(NOLOCK) 其中EntryDate> '06 -22-2012 23:59:59' GROUP BY TargetedID