SQL Server 2019不使用子查询实现分组分类计数的查询方法
问题描述
现有如下源数据:
name type date -------------------------------- john typeA 2022-06-01 james typeA 2022-06-01 james typeA 2022-06-01 james typeB 2022-06-01 bob typeA 2022-06-01 bob typeB 2022-06-01
要求在SQL Server 2019环境中,不使用子查询编写SQL语句,得到如下输出结果:
name countOfTypeA countOfTypeB ------------------------------------ john 1 0 james 2 1 bob 1 1
解决方法
使用GROUP BY搭配条件聚合即可实现,全程无需子查询,参考语句如下(将your_table替换为实际的表名即可):
SELECT name, COUNT(CASE WHEN type = 'typeA' THEN 1 END) AS countOfTypeA, COUNT(CASE WHEN type = 'typeB' THEN 1 END) AS countOfTypeB FROM your_table -- 若仅需统计2022-06-01的数据,可取消下方注释 -- WHERE date = '2022-06-01' GROUP BY name ORDER BY name;
逻辑说明
- 按
name字段分组,将同一名称的所有记录归为同一组 - 组内通过
CASE表达式做类型匹配:匹配目标type时返回非空值,不匹配时默认返回NULL COUNT函数统计时会自动忽略NULL值,因此可以直接得到每组内对应type的记录数,无匹配记录时计数为0,完全符合输出要求- 该写法语法兼容SQL Server 2019,执行效率优于嵌套子查询、CTE等写法。
内容的提问来源于stack exchange,提问作者DarkW1nter
相关产品推荐
相关产品推荐

