You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:03:41