Выберите количество (Отличное Значение) возвращается 1

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

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

Когда я выполняю запрос с КОЛИЧЕСТВОМ (), это возвращает значение 1. Когда я выполняю его без КОЛИЧЕСТВА (), 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-месячными периодами.

Таким образом, я задаюсь вопросом, почему "КОЛИЧЕСТВО (ОТЛИЧНЫЙ ColumnName)" возвращается 1, когда "ColumnName ЯВЛЯЕТСЯ NOT NULL", был указан?

Вот образец данных, когда ИЗБРАННЫЙ TOP 10 ОТЛИЧНЫЙ ColumnName ОТ... и т.д. выполняется:

1346116
1346131
1346425
1346923
1349935
1350115
1350153
2594787
2821944
2879631

8
задан marc_s 3 February 2010 в 20:03
поделиться

5 ответов

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

Count(Distinct Cast(O_ID as Int))
5
ответ дан 5 December 2019 в 23:15
поделиться

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

0
ответ дан 5 December 2019 в 23:15
поделиться
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
ответ дан 5 December 2019 в 23:15
поделиться

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

0
ответ дан 5 December 2019 в 23:15
поделиться

Не могли бы вы выполнить эти запросы:

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
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: