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

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:

  1. 新建映射表:
-- 实际业务可使用永久表存储,分类规则变更时只需增删改表数据
CREATE TABLE #CatMapping (
    OriginalCat VARCHAR(10) PRIMARY KEY,
    StatsCat VARCHAR(10) NOT NULL
)
-- 批量插入所有分类映射规则
INSERT INTO #CatMapping VALUES
('A  ','A  '),
('BB','BB '),
('CCC','CCC')
  1. 关联统计:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:06:04