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

groupby句にUserIdとNameの両方が含まれている必要があります

于 2012-10-03T18:52:53.170 に答える
0

これを行う1つの方法は次のとおりです。

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 に答える