Ошибка при получении данных с SQL Server с помощью GROUP BY - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть таблица, и мне нужно сосчитать всех уникальных пользователей на ней.Схема таблицы:

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

, который отличается, если вы суммируете пользователейстолбец для другого запроса.

Это происходит иногда, не всегда, но это очень странно, потому что у меня разные значения, если я группирую по годам или получаю сумму всех уникальных пользователей.

Я не знаю, в чем проблема, и я пытался с разными запросами, но результат неправильный, если я группирую по годам.

1 Ответ

5 голосов
/ 03 апреля 2012

Один 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 <, чтобы гарантировать, что никакие записи «не упадут через пробелы» или не получат двойной счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...