我编写的一段SQL没有按照预期的方式运行。 一个重要的逻辑是计算有多少客人是VIP,但是SQL似乎总是得到一个错误的答案。
下面的数据库有6位嘉宾,其中3位是VIP。
CREATE TABLE `guest` (
`GuestID` int(11) NOT NULL DEFAULT '0',
`fullname` varchar(255) DEFAULT NULL,
`vip` tinyint(1) DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Dumping data for table `guest`
--
INSERT INTO `guest` (`GuestID`, `fullname`, `vip`) VALUES
(912, 'Sam', 0),
(321, 'Sev', 0),
(629, 'Joe', 0),
(103, 'Tom', 1),
(331, 'Cao', 1),
(526, 'Conor', 1);
最初SQL返回一个值,表示有5个VIP,这是不正确的,因为只有3个VIP。 这是一个相当复杂的数据库,在为这个问题生成一个最小可行的示例时(带有可复制的错误),脚本现在声明只有2个VIP。 同样,这是不正确的。
所讨论的SQL是
SELECT slotguest.FK_SlotNo, Count(CASE WHEN guest.vip = 1 THEN 1 END) AS guest_count
FROM guest
INNER JOIN slotguest ON guest.GuestID = slotguest.FK_guest
GROUP BY slotguest.FK_SlotNo;
slotguest结构和内容如下
CREATE TABLE `slotguest` (
`FK_SlotNo` int(11) NOT NULL,
`FK_guest` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Dumping data for table `slotguest`
--
INSERT INTO `slotguest` (`FK_SlotNo`, `FK_guest`) VALUES
(396, 912),
(396, 321),
(396, 629),
(396, 103),
(396, 331),
(396, 526);
是什么原因导致Count得出一个一贯错误的答案?
如评论中所示(从用户@fábio Amorim,@Rajat处查看),您的查询似乎按预期工作。 由于在时使用大小写设置值,因此最好使用
sum
。
如果您带来不同VIP类别的计数,以查找可能存在数据泄漏的地方,则可能更加可见。
SELECT guest.vip, slotguest.FK_SlotNo, COUNT(*) AS guest_per_category
FROM guest
INNER JOIN slotguest ON guest.GuestID = slotguest.FK_guest
GROUP BY guest.vip,slotguest.FK_SlotNo;