Выберите счетчик (отличительное значение) возвращает 1 - PullRequest
8 голосов
/ 03 февраля 2010

Я создаю запрос в SSMS 2005, который выглядит примерно так:

SELECT COUNT(DISTINCT ColumnName) FROM Table WHERE ColumnName IS NOT NULL

Когда я запускаю запрос с COUNT (), он возвращает значение 1. Когда я запускаю его без COUNT (), SSMS сообщает правильное значение, например, 212 записей.

Данный столбец имеет числовой тип данных (16, 0).

Для тех, кто может спросить, полный запрос:

SELECT COUNT(DISTINCT O_ID) FROM vEmployers
INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer
WHERE E_START >= '01-AUG-2008' AND E_START < '01-AUG-2009'
AND O_ID IS NOT NULL AND O_ID IN (
    SELECT O_ID FROM vEmployers
    INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer
    WHERE E_Start < '01-AUG-2008' and E_Start >= '01-AUG-2007'
)

Этот запрос в основном дает повторяющиеся цифры между двумя 12-месячными периодами.

Так что мне интересно, почему "COUNT (DISTINCT ColumnName)" возвращает 1, когда было указано "ColumnName IS NOT NULL"?

Вот пример данных, когда выполняется SELECT TOP 10 DISTINCT ColumnName FROM ... и т. Д .:

1346116
1346131
1346425
1346923
1349935
1350115
1350153
2594787
2821944
2879631

Ответы [ 5 ]

5 голосов
/ 05 февраля 2010

Использование числового значения (16, 0) заставило меня подозревать, что это связано с типом данных. Добавьте CAST в предложении COUNT, чтобы привести его к типу INT:

Count(Distinct Cast(O_ID as Int))
0 голосов
/ 03 февраля 2010
SELECT   
  COUNT(*)  
FROM    vEmployers  
INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer
WHERE 
        E_START >= '01-AUG-2008' 
        AND E_START < '01-AUG-2009'
        AND O_ID IS NOT NULL AND O_ID IN (
          SELECT O_ID FROM vEmployers
          INNER JOIN vEnrolment ON O_ID = E_EnrolmentEmployer
          WHERE E_Start < '01-AUG-2008' and E_Start >= '01-AUG-2007'
        )
GROUP BY
  O_Id
0 голосов
/ 03 февраля 2010

Удалите DISTINCT, и вы получите счетчик по всем строкам.

0 голосов
/ 03 февраля 2010

Не могли бы вы выполнить следующие запросы:

SELECT  COUNT(DISTINCT O_ID)
FROM    vEmployers
INNER JOIN
        vEnrolment
ON      O_ID = E_EnrolmentEmployer
WHERE   E_START >= '01-AUG-2008' AND
        E_START < '01-AUG-2009'
        AND O_ID IN
        (
        SELECT  O_ID
        FROM    vEmployers
        INNER JOIN
                vEnrolment
        ON      O_ID = E_EnrolmentEmployer
        WHERE   E_Start < '01-AUG-2008'
                AND E_Start >= '01-AUG-2007'
        )

и

SELECT  DISTINCT TOP 5 O_ID
FROM    vEmployers
INNER JOIN
        vEnrolment
ON      O_ID = E_EnrolmentEmployer
WHERE   E_START >= '01-AUG-2008' AND
        E_START < '01-AUG-2009'
        AND O_ID IN
        (
        SELECT  O_ID
        FROM    vEmployers
        INNER JOIN
                vEnrolment
        ON      O_ID = E_EnrolmentEmployer
        WHERE   E_Start < '01-AUG-2008'
                AND E_Start >= '01-AUG-2007'
        )
ORDER BY
        O_ID

дословно, ничего не меняя?

0 голосов
/ 03 февраля 2010

Полагаю, это потому, что все возвращаемые строки имеют одинаковое значение для O_ID. Вы можете сделать COUNT(*) или COUNT() для ключа, уникального для каждой строки, чтобы получить количество строк.

...