使用GROUP BY从SQL Server检索数据时出错

时间:2012-04-03 08:27:26

标签: sql sql-server sql-server-2008

我有一张桌子,我需要计算所有独特的用户。该表的架构是:

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

如果对另一个查询中的users列求和,则会有所不同。

有时会发生这种情况,并非总是如此,但这很奇怪,因为如果按年份分组或者我得到所有唯一身份用户的总和,我会有不同的值。

我不知道问题出在哪里,我尝试了不同的查询,但如果按年分组,结果就错了。

1 个答案:

答案 0 :(得分: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 <来确保没有记录“通过间隙掉落”或被重复计算。