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

如何编写SQL查询统计每位宠物主人的猫狗数量并分列为返回字段

合并宠物统计查询的解决方案

原始宠物表(Pets)

Owner_NamePet_typePet_Name
FredDogScruffy
FredDogRhino
FredCatCuddles
JanDogBones
JanCatShadow
MichelleCatMario

期望输出结果

Owner_nameDog_CountCat_Count
Fred21
Jan11
Michelle01

你已经写出了两个单独统计的SQL,这里提供两种方法将它们合并为一个查询:

方法一:条件聚合(最简洁高效)

通过CASE WHEN配合聚合函数,直接在分组时完成条件统计:

SELECT 
    Owner_Name,
    COUNT(CASE WHEN Pet_type = 'Dog' THEN 1 END) AS Dog_Count,
    COUNT(CASE WHEN Pet_type = 'Cat' THEN 1 END) AS Cat_Count
FROM Pets
GROUP BY Owner_Name;

也可以用SUM实现相同效果:

SELECT 
    Owner_Name,
    SUM(CASE WHEN Pet_type = 'Dog' THEN 1 ELSE 0 END) AS Dog_Count,
    SUM(CASE WHEN Pet_type = 'Cat' THEN 1 ELSE 0 END) AS Cat_Count
FROM Pets
GROUP BY Owner_Name;

原理:CASE WHEN会为符合条件的行返回1,不符合的返回NULL(COUNT会忽略NULL)或0(SUM直接累加),这样就能分别统计每种宠物的数量,没有对应宠物的主人会自动显示0。

方法二:LEFT JOIN子查询

基于你已有的两个子查询,通过左连接合并结果,并用COALESCE将空值转为0:

SELECT 
    o.Owner_Name,
    COALESCE(d.Dog_Count, 0) AS Dog_Count,
    COALESCE(c.Cat_Count, 0) AS Cat_Count
FROM (SELECT DISTINCT Owner_Name FROM Pets) o
LEFT JOIN (
    SELECT Owner_Name, COUNT(*) AS Dog_Count
    FROM Pets
    WHERE Pet_type = 'Dog'
    GROUP BY Owner_Name
) d ON o.Owner_Name = d.Owner_Name
LEFT JOIN (
    SELECT Owner_Name, COUNT(*) AS Cat_Count
    FROM Pets
    WHERE Pet_type = 'Cat'
    GROUP BY Owner_Name
) c ON o.Owner_Name = c.Owner_Name;

原理:先获取所有唯一的主人列表,再分别左连接狗和猫的统计结果,COALESCE确保没有对应宠物的主人显示0而非NULL。

内容的提问来源于stack exchange,提问作者user2396738

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:50:21