0

我有 3 张桌子:

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

现在,我想根据这个机制选择最热门话题的创建者:获取比指定日期更新的评论。按主题的创建者对这些评论进行分组,并按组中的行数排序。

但是,我不确定我的查询是否遵循这个逻辑(根据结果似乎,但我只有几个用户和主题),但主要问题是当我要选择用户的名称时(Users.Name) ,我得到一个错误:

列 '[TestDatabase].[dbo].[Users].[Name]' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

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子句中是最好的解决方案。

4

3 回答 3

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
于 2012-10-03T18:52:58.207 回答
1

您需要在 group by 子句中同时包含 UserId 和 Name

于 2012-10-03T18:52:53.170 回答
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
于 2012-10-03T18:53:37.310 回答