COUNT(DISTINCT())返回假值

问题描述:

我尝试在我的子查询表中计算总员工数。假设计数结果将返回0,但它一直返回1.COUNT(DISTINCT())返回假值

如果我尝试只返回employee_id和month在一起,我没有得到may的任何返回值,这是正确的,但每次我尝试计数(不同的),我会得到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) 
+0

Mysql不是SQL-Server,所以我删除了标记 – Jens

+0

COUNT DISTINCT没有被破坏,SQL也没有被破坏。你的数据是什么,你期望什么,你得到了什么?如果返回1行,结果将是1 –

+0

结果仅取决于您的第二个查询。要更好地检查它自己。 –

count因为你拥有它现在也算0那就是CASE表达ELSE子句。即使使用DISTINCT,仍会计算该0的一个实例。

取出ELSE 0,让你有NULL - 这是不计算在内:

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

注意与NULLIF可以缩短这个表达式:

count (distinct(CASE x.month WHEN 5 THEN NULLIF(x.employee_id, 0) END)) as test_may 
+0

谢谢。它工作正常! – gpsrosak

count将返回相同即使在这两种情况下也算。因为在这两种情况下你都给出了Count函数的值。

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

计数只会计数的值是否是0或100作为1 &跳过空值而计数。所以在其他条件下NULL会给你正确的输出。

+0

谢谢。它完美的作品。我忽略了ELSE 0,谢谢! – gpsrosak

+0

不客气@gpsrosak –