繁体   English   中英

SQL 计数产生不正确的结果

[英]SQL Count producing incorrect results

我正在尝试计算特定工作时段中工人的数量和类型。

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

我在 MySql 中构建了一个关系数据库。 相关表是worker - slotwork - slot ,其中 worker 和 slot 之间存在多对多关系。 许多工作人员可以在一个单独的插槽中。

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(CASE WHEN worker.junior = 0 THEN 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;

初级是布尔值的地方

示例数据可以在https://pastebin.pl/view/832895ab找到

我认为计数正在制造问题。

  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。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM