Sql 选择计数(不同值)返回1

Sql 选择计数(不同值)返回1,sql,sql-server,count,distinct,Sql,Sql Server,Count,Distinct,我在2005年设计了一个查询,如下所示: SELECT COUNT(DISTINCT ColumnName) FROM Table WHERE ColumnName IS NOT NULL 当我使用COUNT运行查询时,它返回值1。当我不计数运行它时,SSMS会报告正确的值,例如212条记录 该列的数据类型为numeric16,0 对于那些可能会问的人,完整的查询是: SELECT COUNT(DISTINCT O_ID) FROM vEmployers INNER JOIN vEnrolme

我在2005年设计了一个查询,如下所示:

SELECT COUNT(DISTINCT ColumnName) FROM Table WHERE ColumnName IS NOT NULL
当我使用COUNT运行查询时,它返回值1。当我不计数运行它时,SSMS会报告正确的值,例如212条记录

该列的数据类型为numeric16,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'
)

我猜这是因为返回的所有行都共享相同的O_ID值。您可以进行计数*或对每行唯一的键进行计数以获得行计数。

删除DISTINCT,您将获得所有行的计数。

是否可以运行以下查询:

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'
        )


一字不改?

数字16,0的使用让我怀疑它与数据类型有关。在COUNT子句中添加强制转换以将其强制转换为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
Count(Distinct Cast(O_ID as Int))


由于DISTINCT子句,所有返回的行都是唯一的,通过使用COUNT进行查询可以证明这一点。您能否提供一个没有COUNT的结果的简短摘录,只显示几个O_ID?好的,COUNTDISTINCT。。。当然会计算唯一的非空值,仅此而已。在没有DISTINCE子句的情况下,不要执行distinct、count*或计算所有行中唯一的内容。您关于COUNTDISTINCT的权限。。。有效,结果应与行计数相同,无需计数功能…感谢确认,只是作为答案添加。True。但正如您从完整查询中看到的,其中涉及一个连接,因此这将返回重复的ID。它并没有回答为什么COUNT返回1而它不应该返回1的问题。是的,这令人费解,感谢您发布更多信息。您是否运行了完全相同的查询来获取摘录,只是删除了计数?是的,摘录是完全相同的查询,没有使用计数函数。真是莫名其妙!我想知道这是否与数据类型有关。我想知道你是否可以在COUNT子句中添加一个CAST,将其转换为INT类型,看看这是否会改变什么?这完全有效,CountDistinct CastO_ID为INT:D。请你将其作为答案提交,我有一些代表点要告诉你。@GateKiller:你绝对肯定你只是忽略了计数而没有其他内容吗?感谢你迄今为止的所有帮助伙计们:你使用的是什么版本的SQL Server?抱歉-刚刚看到上面的2005引用。第一个查询返回一行,值为1。第二个查询返回五行唯一值。@GateKiller:您能发布表的结构吗?您感兴趣的是什么信息?我不确定是否允许发布完整的表架构+每个表都有很多列。@GateKiller:只发布相关列:O_ID、E_START、E_EnrolmentEmployer:它们的数据类型、索引(如果有)以及它们属于哪些表。另外,最好能看到每个查询的执行计划。只需运行SET SHOWPLAN\u TEXT ON\n GO\n SELECT…\n是换行符
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
Count(Distinct Cast(O_ID as Int))