2012-09-28 74 views
1

这是我的查询:为什么Count(*)返回意外数字?

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(*)

这样我就可以把上面的查询为:

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 

等..

有没有在这个创作的每一个记录D B。

+2

请发布重现问题的示例数据。您的第一个查询应该可以工您的第二个查询返回组数。 –

+0

@Martin:示例记录现在在那里。 – Jack

回答

2

根据你说的回报预期的结果你的第二个查询(假设UserIDUsers的PK)我想这是你所需要的

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再次折叠它们并计算结果的行数。

+0

你可以请建议为什么我的第一个查询不起作用?不应该计数(*)返回分组后的行数? – Jack

+1

@Jack - “COUNT .... GROUP BY”返回每个组的计数。它告诉你每个UserID他们已经做了多少次登录。 –

+0

谢谢。这很明显。我不知道是什么让我想到我以前的想法!然而,我的下一个问题是,我正在使用一个自动化类为我构建分页查询,因为我需要知道任何给定结果集中存在的总项目,它必须是通用的。我只是想知道,如果我将count查询写为有问题的第二个查询,而且我有100万条记录,那会非常慢吗?我的意思是,扩大所有行会产生巨大的成本? – Jack

1

更改第一行:

Select COUNT(*), u.UserID 
+0

这仍然不起作用。我得到102,11。11是它返回的数量。我想在u上分组后得到总行数。UserID和真正的计数只是1.它返回11哪个记录存在于userloginhistory表中。 – Jack

0

这应该为您提供用户ID列表,并在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 
0

但我需要找出为什么是一组之前返回的记录COUNT(*)的是由我如何解决一日查询本身

据计算行数为每个用户名(登录次数),这正是group by应该如何工作。

0

COUNT是一个聚合函数,这是它应该如何工作。你每个分组计数。

在您的第一个查询中,您正在查询每个用户的userloginhistory数量。在您的第二个查询中,您正在查询具有登录历史记录的用户数量。

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

相关问题