Mysql SQL计数产生不正确的结果
我试图计算特定工作时段的工人数量和类型 有两种类型的工人。高年级和低年级。代码应该分别计算一个插槽中有多少高级和初级员工 我已经在MySql中构建了一个关系数据库。相关表格为工作者-slotwork-插槽,其中工作者和插槽之间存在多对多关系。许多工人可以在一个单独的位置工作 SQL的结果令人不安地不一致。有时雇员的数量是完全正确的。有时它看起来完全不正确 我能找到的最简单的例子如下: 用于计算初级工人数量的SQL是Mysql SQL计数产生不正确的结果,mysql,sql,count,relational-database,Mysql,Sql,Count,Relational Database,我试图计算特定工作时段的工人数量和类型 有两种类型的工人。高年级和低年级。代码应该分别计算一个插槽中有多少高级和初级员工 我已经在MySql中构建了一个关系数据库。相关表格为工作者-slotwork-插槽,其中工作者和插槽之间存在多对多关系。许多工人可以在一个单独的位置工作 SQL的结果令人不安地不一致。有时雇员的数量是完全正确的。有时它看起来完全不正确 我能找到的最简单的例子如下: 用于计算初级工人数量的SQL是 SELECT slotwork.FK_SlotNo, Count(CASE WH
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的数据类型是什么?至少显示一些示例输入数据?比如说,对于有问题的4FK_SlotNo
,以及所有相关的工作人员记录?您应该提供足够的信息,让我们用dbfiddle或类似的语言重现这个案例:@Stumbler根本没有帮助。此外,在示例数据中似乎没有junior
列。请向我们展示您问题中的真实数据。检查是否存在其他值:select*from worker where junior为null或junior 0或junior 1
好的-您能详细说明一下吗?它主要是正确地计算数字:您是否认为您已经确定了解释其不一致性的原因?您的计数与count(*)
相同,因为您从不返回空值,因此必须删除否则0
(原始查询中不存在该值)