Я разрабатываю запрос в 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
Использование числа(16, 0) заставило меня заподозрить, что оно связано с типом данных. Добавить CAST в выражение COUNT, чтобы привести его к типу INT:
Count(Distinct Cast(O_ID as Int))
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
Полагаю, это потому, что все возвращаемые строки имеют одинаковое значение для O_ID
. Вы можете сделать COUNT(*)
или COUNT()
на клавише, которая уникальна для каждой строки, чтобы получить количество строк.
Не могли бы вы выполнить эти запросы:
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
дословно, ничего не меняя?