SQL查询问题:统计未分配Dog的用户数量结果不符求助
问题分析与解决办法
嘿,我来帮你搞懂这个问题~你的查询之所以返回4而不是预期的2,核心是逻辑理解偏差:
你的原查询:
select count(distinct Name) from Table where Animal <> 'Dog'
它的逻辑是:找出所有「动物不是Dog」的记录,然后对这些记录里的用户名去重统计。但问题在于,像Bill、Sara这类用户,他们虽然有Dog,但同时也有Cat/Fish,这些非Dog的记录会被你的查询捕捉到,所以Bill和Sara会被算进结果里,最终得到4个用户(Bill、John、Sara、Mark),但你真正要的是完全没有分配Dog的用户(只有John和Mark)。
正确的SQL写法有这些:
方法1:使用NOT EXISTS子查询(最直观)
SELECT COUNT(DISTINCT Name) FROM Table t1 WHERE NOT EXISTS ( SELECT 1 FROM Table t2 WHERE t2.Name = t1.Name AND t2.Animal = 'Dog' )
这个查询的逻辑是:对每个用户,检查是否存在一条属于他的「Animal=Dog」记录,如果不存在,就把这个用户计入统计,完美匹配你的需求。
方法2:GROUP BY + HAVING分组筛选
SELECT COUNT(*) FROM ( SELECT Name FROM Table GROUP BY Name HAVING SUM(CASE WHEN Animal = 'Dog' THEN 1 ELSE 0 END) = 0 ) AS no_dog_users
先按用户名分组,统计每个用户拥有Dog的数量(用CASE语句转换为1/0后求和),筛选出数量为0的用户,最后统计这些用户的总数。
方法3:LEFT JOIN筛选无匹配记录的用户
SELECT COUNT(DISTINCT t1.Name) FROM Table t1 LEFT JOIN Table t2 ON t1.Name = t2.Name AND t2.Animal = 'Dog' WHERE t2.Name IS NULL
把原表和「仅包含Dog记录的子表」做左连接,那些没有Dog的用户,在t2表中不会有匹配的记录,对应的字段会是NULL,筛选这些用户即可。
内容的提问来源于stack exchange,提问作者Mathias Jespers
相关产品推荐
相关产品推荐

