如何编写SQL查询统计每位宠物主人的猫狗数量并分列为返回字段
合并宠物统计查询的解决方案
原始宠物表(Pets)
| Owner_Name | Pet_type | Pet_Name |
|---|---|---|
| Fred | Dog | Scruffy |
| Fred | Dog | Rhino |
| Fred | Cat | Cuddles |
| Jan | Dog | Bones |
| Jan | Cat | Shadow |
| Michelle | Cat | Mario |
期望输出结果
| Owner_name | Dog_Count | Cat_Count |
|---|---|---|
| Fred | 2 | 1 |
| Jan | 1 | 1 |
| Michelle | 0 | 1 |
你已经写出了两个单独统计的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
相关产品推荐
相关产品推荐

