2012-04-03 101 views
2

我有一張表,我需要統計其上的所有唯一用戶。表的模式是:使用GROUP BY從SQL Server檢索數據時出錯

idAccess | idClient | date    | uid 
1  | 12  | 2012-04-03 10:59 | 1234-1234-1234 
2  | 13  | 2012-01-03 11.23 | 2345-2345-2345 
3  | 12  | 2012-04-03 10:59 | 1234-1234-1234 
4  | 12  | 2012-04-03 11:59 | 1234-1234-1234 
5  | 12  | 2012-02-23 02:39 | 5788-5788-5687 
6  | 12  | 2011-12-03 12:31 | asdf-1234-asdf 
7  | 12  | 2011-10-13 13:36 | eeef-1234-eeee 
8  | 15  | 2010-11-23 17:33 | qwer-EeQE-fhjh 

這是查詢:

Select 
    count(*) AS ct, count(DISTINCT(uid)) as users, YEAR(date) as ano 
FROM 
    [AQUA_INTRANET].[dbo].[Accesos] 
WHERE 
    idClient IN (12,13,15) 
    AND date> '01-01-2006 00:00' AND date< '04-02-2012 23:59' 
GROUP BY 
    YEAR(date) 
ORDER BY 
    year 

和結果:

ct | users | year 
5 | 6 | 2012 
2 | 3 | 2011 
1 | 1 | 2010 

如果我執行這個查詢,我發現了一個錯誤的結果,因爲結果的總和不同於此其他查詢:

Select 
    count(DISTINCT(uid)) as users 
FROM 
    [AQUA_INTRANET].[dbo].[Accesos] 
WHERE 
    idCliente IN (12,13,15) 
    AND fecha > '01-01-2006 00:00' 
    AND fecha < '04-02-2012 23:59' 

和結果是:

users 
6 

,如果你在其他查詢總結用戶列,它是不同的。

有時會發生這種情況,但並非總是如此,但這很奇怪,因爲如果按年份分組,或者如果我獲得所有唯一用戶的總和,我的值就會不同。

我不知道問題出在哪裏,我嘗試了不同的查詢,但結果它錯了,如果我按年分組。

回答

5

一個uid可以有一年以上的記錄。

試試這三種查詢

SELECT count(DISTINCT(uid)) as users 
    FROM [AQUA_INTRANET].[dbo].[Accesos] 
WHERE idCliente IN (12,13,15) 
    AND fecha >= '01-01-2010 00:00' AND fecha < '01-01-2011' 

SELECT count(DISTINCT(uid)) as users 
    FROM [AQUA_INTRANET].[dbo].[Accesos] 
WHERE idCliente IN (12,13,15) 
    AND fecha >= '01-01-2011 00:00' AND fecha < '01-01-2012' 

SELECT count(DISTINCT(uid)) as users 
    FROM [AQUA_INTRANET].[dbo].[Accesos] 
WHERE idCliente IN (12,13,15) 
    AND fecha >= '01-01-2012 00:00' AND fecha < '04-02-2012 23:59' 

另外請注意,我用>= AND <,以確保沒有記錄「秋天通過縫隙」或獲得雙倍計數。