1

これは私のクエリです:

Select COUNT(*) 
From 
    Users u
    Inner Join 
    UsersLoginHistory uh On u.UserID = uh.UserID 
Where 
    1 = 1   
    And 
    u.AccountID = 37 
Group By u.UserID

私が取得できるようにしたいのはCount(*)、u.UserId でグループ化した後に数値を返すことです。Count(*)ただし、group by が作成される前に返されます。

したがって、上記のクエリを次のように書き直すことができます。

Select COUNT(*)
From (
    Select   u.Username   
    From 
        Users u
        Inner Join 
        UsersLoginHistory uh On u.UserID = uh.UserID 
    Where 
        1 = 1   
        And 
        u.AccountID = 37 
    Group By u.UserID
) v

しかし、グループ化が行われる前にレコードが返される理由とCount(*)、最初のクエリ自体を修正する方法を見つける必要があります。

編集:サンプル レコード

ユーザー テーブル

UserId     Username
102        tom.kaufmann

UserLoginHistory テーブル

UsersLoginHistoryID UserID  LoginDateTime         LogoutDateTime         IPAddress
1                    102    2012-09-28 01:16:00 NULL                 115.118.71.248
2                    102    2012-09-28 01:29:00 2012-09-28 01:29:00  127.0.0.1
3                    102    2012-09-28 01:32:00 2012-09-28 01:32:00  127.0.0.1
4                    102    2012-09-28 01:41:00 NULL                 115.118.71.248
5                    102    2012-09-28 01:43:00 2012-09-28 07:04:00  115.118.71.248  

等々..

この DB のすべてのレコードを書き込んでいません。

4

5 に答える 5

2

あなたが言う2番目のクエリに基づいて、目的の結果が返されると仮定します(およびUserIDのPKであると仮定しUsersます)これが必要なものだと思います

SELECT Count(UserID)
FROM   Users u
WHERE  u.AccountID = 37
       AND EXISTS (SELECT *
                   FROM   UsersLoginHistory uh
                   WHERE  u.UserID = uh.UserID)

これは、結合されたすべての行を展開してから再度折りたたんでGroup By u.UserID、結果の行数をカウントするよりも効率的です。

于 2012-09-28T13:59:15.733 に答える
1

最初の行を次のように変更します。

Select COUNT(*), u.UserID
于 2012-09-28T13:55:18.530 に答える
0

COUNT は集計関数であり、これが本来の動作方法です。グループごとにカウントされます。

最初のクエリでは、ユーザーごとの userloginhistory の数をクエリしています。2 番目のクエリでは、ログイン履歴を持つユーザーの数をクエリしています。

http://msdn.microsoft.com/en-us/library/ms173454.aspx

于 2012-09-28T14:27:02.513 に答える
0

これにより、UserIds のリストと、UsersLoginHistory テーブル内のエントリ数が表示されます。

SELECT u.UserId
, COUNT(uh.*)
FROM Users u
INNER JOIN UsersLoginHistory uh ON u.UserID = uh.UserID
WHERE u.AccountID = 37
GROUP BY u.UserID
于 2012-09-28T13:58:54.867 に答える
0

しかし、グループ化が行われる前に Count(*) がレコードを返す理由と、最初のクエリ自体を修正するにはどうすればよいかを調べる必要があります

各 UserID の行数 (ログイン数) をカウントしていgroup byます。

于 2012-09-28T14:17:05.257 に答える