SQL Server如何不使用UNION命令实现类UNION的分类统计结果
解决方案
方案1:直接GROUP BY聚合(最推荐,适配1000个分类的场景,无需硬编码)
你的需求本质是按Cat字段分组统计每个分类的行数,完全不需要写UNION,自动覆盖所有存在的分类,无需额外编码:
SELECT Cat, COUNT(1) AS CCount FROM #t GROUP BY Cat -- 可按需添加排序规则,比如 ORDER BY CCount DESC
该方案仅需扫描一次原表,相比1000次UNION的1000次全表扫描,性能提升极其显著。
方案2:自定义分组(如需合并多个分类统计)
如果你的业务逻辑需要将部分分类合并为同一个统计项,类似示例中把非A、非BB的分类归为一类,可以用CASE表达式定义分组规则:
SELECT CASE WHEN Cat = 'A ' THEN 'A ' WHEN Cat = 'BB' THEN 'BB ' ELSE 'CCC' END AS Cat, COUNT(1) AS CCount FROM #t GROUP BY CASE WHEN Cat = 'A ' THEN 'A ' WHEN Cat = 'BB' THEN 'BB' ELSE 'CCC' END
方案3:映射表方案(适合分类规则复杂、经常变动的场景)
如果自定义分类规则超过10个,建议单独维护一张分类映射表,只需维护表数据即可,不需要修改统计SQL:
- 新建映射表:
-- 实际业务可使用永久表存储,分类规则变更时只需增删改表数据 CREATE TABLE #CatMapping ( OriginalCat VARCHAR(10) PRIMARY KEY, StatsCat VARCHAR(10) NOT NULL ) -- 批量插入所有分类映射规则 INSERT INTO #CatMapping VALUES ('A ','A '), ('BB','BB '), ('CCC','CCC')
- 关联统计:
SELECT m.StatsCat AS Cat, COUNT(1) AS CCount FROM #t t INNER JOIN #CatMapping m ON t.Cat = m.OriginalCat GROUP BY m.StatsCat
关于PIVOT的说明
你提到的PIVOT是行转列专用语法,你的需求是按行统计分类数量,属于常规GROUP BY使用场景,不需要使用PIVOT,当前方案的复杂度和性能都更优。
内容的提问来源于stack exchange,提问作者Mich28
相关产品推荐
相关产品推荐

