Sql server COUNT(DISTINCT())返回假值

Sql server COUNT(DISTINCT())返回假值,sql-server,count,distinct,Sql Server,Count,Distinct,我尝试在子查询表中计算员工总数。假设计数结果将返回0,但它将继续返回1 如果我尝试只返回员工id和月份,我没有得到任何正确的五月返回值,但每次尝试countdistinct时,我都会得到1作为我的返回值。这是我的sql SELECT count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN x.employee_id ELSE 0 END)) as test_may FROM(

我尝试在子查询表中计算员工总数。假设计数结果将返回0,但它将继续返回1

如果我尝试只返回员工id和月份,我没有得到任何正确的五月返回值,但每次尝试countdistinct时,我都会得到1作为我的返回值。这是我的sql

SELECT

  count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
  x.employee_id
        ELSE 0 END)) as test_may
FROM(
 (
SELECT 

     h.month,
     h.employee_id,
     eb.employee_no,
     ee.company_code,
     h.amount,   
     h.year, 
     h.trx_type,   
     h.trx_code, 
     v.trx_desc,
    h.frequency,
    h.run_sequence

FROM 
    v_employee h,
    v_trans v,
    employee_emp ee, 
    employee eb          
  WHERE
        ( h.year = 2014 ) AND  
        ( h.employee_id = ee.employee_id ) AND  
        ( ee.employee_id = eb.employee_id ) AND 
        ( h.employee_no = eb.employee_no ) AND 
        ( h.trx_code = v.trx_code ) AND
        ( h.trx_type = v.trx_type ) AND
        ( v.company_code = ee.company_code OR v.company_code is NULL) AND
        ( h.trx_type IN ('S','B','N','O','A','D','L') )
)
)x,
employee_emp ee,
employee eb

 WHERE

    ( x.employee_id = ee.employee_id ) AND
    ( ee.employee_id = eb.employee_id ) AND
    ( x.employee_no = eb.employee_no ) AND
     ( x.year = 2014 ) 
现在的计数还将对CASE表达式的ELSE子句中的0进行计数。即使使用DISTINCT,仍将计算该0的一个实例

删除ELSE 0,使其为空-不计算在内:

count (distinct(CASE WHEN x.month =5 and x.employee_id <> 0
                     THEN x.employee_id
                END)) as test_may
即使在这两种情况下,您的计数也将返回相同的计数。因为您在这两种情况下都为Count函数提供了值

 count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
  x.employee_id
        ELSE 0 END))


Count只将值计数为1,无论值是0还是100&计数时跳过空值。因此,在Else条件下,NULL将为您提供正确的输出。

Mysql不是SQL Server,因此我删除了标记计数DISTINCT,而SQL语言也没有损坏。你的数据是什么?你期望什么?你得到了什么?如果返回1行,结果将是1结果取决于您的第二个查询。。最好自己检查一下,没什么问题。您的DISTINCT仅返回值0。然后计算返回的值。只有一个值返回0,所以您有1个值。您是否混淆了计数和求和?即使结果为0,仍然是1结果,因此COUNT0将返回1。你为什么不改为用小组讨论呢?
 count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
  x.employee_id
        ELSE 0 END))
 count (distinct(CASE WHEN (x.month =5 and x.employee_id <> 0) THEN 
  x.employee_id
        ELSE NULL END))