2012-10-03 94 views
0

不能選擇列我有3個表:從數據庫

  • [Users]: UserId, Name...
  • [Topics]: TopicId, CreatorUserId...
  • [Comments]: CommentId, TopicId...

現在,我想根據這種機制選擇最熱門主題的創建者: 獲取比指定日期更新的評論。按主題的創建者對這些評論分組,然後按組中的行數排序。然而,我不確定我的查詢是否遵循這個邏輯(看起來根據結果,但我只有一些用戶和主題),但主要問題是,當我想選擇名稱用戶(Users.Name),我得到一個錯誤:

Column '[TestDatabase].[dbo].[Users].[Name]' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

T-SQL查詢:

SELECT 
    Users.UserId, Users.Name, COUNT(Users.UserId) as RowCountInGroup 
FROM [TestDatabase].[dbo].[Users] 
INNER JOIN [TestDatabase].[dbo].[Topics] ON Topics.CreatorUserId = Users.UserId 
INNER JOIN [TestDatabase].[dbo].[Comments] ON Comments.TopicId = Topics.TopicId 
WHERE 
    Comments.CreationDate > CAST('14 SEPTEMBER 2012' as DateTime) 
GROUP BY Users.UserId 
ORDER BY RowCountInGroup DESC 

謝謝你幫助我。

編輯:我已經複製了原始錯誤消息。我需要從用戶中選擇電子郵件,城市等欄目,所以我不確定將所有這些添加到group by子句是最佳解決方案。

+1

錯誤和SQL沒有出現匹配 - 你確定錯誤不是關於'Users.Name'列嗎? – Oded

+1

你必須在Users.Name上進行分組,即使錯誤文本與你的查詢所做的不匹配,它也可以解釋你得到的錯誤。 –

回答

4

您可以通過兩列需要組(或一般:所有列),您選擇(即不是由COUNT聚合運算符彙總) :

SELECT 
    Users.UserId, Users.Name, COUNT(Users.UserId) as RowCountInGroup 
FROM [TestDatabase].[dbo].[Users] 
INNER JOIN [TestDatabase].[dbo].[Topics] ON Topics.CreatorUserId = Users.UserId 
INNER JOIN [TestDatabase].[dbo].[Comments] ON Comments.TopicId = Topics.TopicId 
WHERE 
    Comments.CreationDate > CAST('14 SEPTEMBER 2012' as DateTime) 
GROUP BY 
    Users.UserId, Users.Name <=== you need to add "Users.Name" here! 
ORDER BY RowCountInGroup DESC 
+0

是的,我這樣做,但我需要選擇至少五列。 Users.City,Users.Email ...這是唯一的方法嗎? – laszlokiss88

+0

@ laszlokiss88:是的 - 就是這樣做。唯一的方法來做到這一點。 –

+0

@ laszlokiss88>是啊...要走的路 –

1

您需要通過條款有你的團隊在這兩個用戶名和姓名

0

下面是做這件事的一種方法:

SELECT a.UserId, b.Name, a.RowCountInGroup 
FROM 
    (SELECT Users.UserId, COUNT(Users.UserId) as RowCountInGroup 
    FROM [TestDatabase].[dbo].[Users] 
    INNER JOIN [TestDatabase].[dbo].[Topics] 
    ON Topics.CreatorUserId = Users.UserId 
    INNER JOIN [TestDatabase].[dbo].[Comments] ON 
    Comments.TopicId = Topics.TopicId 
    WHERE Comments.CreationDate > CAST('14 SEPTEMBER 2012' as DateTime) 
    GROUP BY Users.UserId 
    ORDER BY RowCountInGroup DESC) a 
LEFT JOIN [TestDatabase].[dbo].[Users] b ON b.UserId = a.UserId 

任何時候你有與集料一列,則必須GROUP BY那一列:

SELECT col1, col2, COUNT(col3) 
FROM table 
GROUP BY col1, col2