2012-09-28 109 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

相關問題