2017-04-10 69 views
1

我嘗試在我的子查詢表中計算總員工數。假設計數結果將返回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

結果僅取決於您的第二個查詢。要更好地檢查它自己。 –

回答

2

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

1

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 –