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)
的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
谢谢。它工作正常! – 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
会给你正确的输出。
谢谢。它完美的作品。我忽略了ELSE 0,谢谢! – gpsrosak
不客气@gpsrosak –
Mysql不是SQL-Server,所以我删除了标记 – Jens
COUNT DISTINCT没有被破坏,SQL也没有被破坏。你的数据是什么,你期望什么,你得到了什么?如果返回1行,结果将是1 –
结果仅取决于您的第二个查询。要更好地检查它自己。 –