Mysql SQL计数产生不正确的结果

Mysql SQL计数产生不正确的结果,mysql,sql,count,relational-database,Mysql,Sql,Count,Relational Database,我试图计算特定工作时段的工人数量和类型 有两种类型的工人。高年级和低年级。代码应该分别计算一个插槽中有多少高级和初级员工 我已经在MySql中构建了一个关系数据库。相关表格为工作者-slotwork-插槽,其中工作者和插槽之间存在多对多关系。许多工人可以在一个单独的位置工作 SQL的结果令人不安地不一致。有时雇员的数量是完全正确的。有时它看起来完全不正确 我能找到的最简单的例子如下: 用于计算初级工人数量的SQL是 SELECT slotwork.FK_SlotNo, Count(CASE WH

我试图计算特定工作时段的工人数量和类型

有两种类型的工人。高年级和低年级。代码应该分别计算一个插槽中有多少高级和初级员工

我已经在MySql中构建了一个关系数据库。相关表格为工作者-slotwork-插槽,其中工作者和插槽之间存在多对多关系。许多工人可以在一个单独的位置工作

SQL的结果令人不安地不一致。有时雇员的数量是完全正确的。有时它看起来完全不正确

我能找到的最简单的例子如下:

用于计算初级工人数量的SQL是

SELECT slotwork.FK_SlotNo, Count(CASE WHEN worker.junior = 1 THEN 1 END) 
AS worker_count 
FROM worker 
INNER JOIN slotwork ON worker.EmployeeID = slotwork.FK_worker GROUP BY slotwork.FK_SlotNo;
目前在任何插槽中都没有记录初级员工,但返回的结果如下所示

SlotID worker_count
445 0
446 0
447 0
448 0
452 1
453 0
454 0
455 0
456 0
457 0
458 0
459 0
460 1
461 0
464 0
465 0
466 0
467 0
...
让我们从上面的插槽中选择4个。445、452、460和463

445 is 0 ... correct.   There are 0 junior workers, and 5 senior workers.
452 is 1 ... incorrect. There are 0 junior workers, and 4 senior workers.
460 is 1 ... incorrect. There are 0 junior workers, and 4 senior workers.
463 is 0 ... correct.   There are 0 junior workers, and 3 senior workers.
运行代码以确定高级工作人员的数量基本上是正确的(Count(当worker.junior=0然后1 END时的情况)),但仍然存在明显的差异

让我们用和以前一样的插槽吧

445 is 5 ... correct.   There are 0 junior workers, and 5 senior workers.
452 is 3 ... incorrect. There are 0 junior workers, and 4 senior workers.
460 is 3 ... incorrect. There are 0 junior workers, and 4 senior workers.
463 is 3 ... correct.   There are 0 junior workers, and 3 senior workers.
是什么导致了这些差异

工人表的结构如下所示

CREATE TABLE `worker` (
  `EmployeeID` int(11) NOT NULL DEFAULT '0',
  `fullname` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `junior` tinyint(1) DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中junior是一个布尔值


样本数据可以在

上找到,我认为是计数造成了问题

  select count(CASE WHEN 'a' = 'b' THEN 1 else 0 END) as worker_count;
  Result --> 1
  select sum(CASE WHEN 'a' = 'b' THEN 1 else 0 END) as worker_count;
  Result --> 0
添加初级工作人员和插槽,然后尝试以下查询

SELECT slotwork.FK_SlotNo, sum(CASE WHEN worker.junior = 1 THEN 1 else 0 END) 
AS worker_count 
FROM worker 
INNER JOIN slotwork ON worker.EmployeeID = slotwork.FK_Employee 
GROUP BY slotwork.FK_SlotNo;
由于Count()函数的原因,现有查询将不一致,在这种情况下,它将计数0和1。
希望这有帮助

请提供样本数据。您的
COUNT
表达式正确,应该只为那些
FK_SlotNo
组生成非零计数,这些组具有
junior=1
的记录。worker.junior的数据类型是什么?至少显示一些示例输入数据?比如说,对于有问题的4
FK_SlotNo
,以及所有相关的工作人员记录?您应该提供足够的信息,让我们用dbfiddle或类似的语言重现这个案例:@Stumbler根本没有帮助。此外,在示例数据中似乎没有
junior
列。请向我们展示您问题中的真实数据。检查是否存在其他值:
select*from worker where junior为null或junior 0或junior 1
好的-您能详细说明一下吗?它主要是正确地计算数字:您是否认为您已经确定了解释其不一致性的原因?您的计数与
count(*)
相同,因为您从不返回空值,因此必须删除
否则0
(原始查询中不存在该值)