如何在SQL中将同表的category与subcategory合并到一列并展示汇总值
解决方案:合并分类与子分类并展示汇总行
没问题,我来帮你实现这个需求!核心思路是通过UNION ALL将分类汇总行和子分类明细行合并,再通过排序规则确保分类行排在对应子分类的前面。
完整SQL代码
-- 生成分类的汇总行 SELECT NEW = catgory, Value = SUM(CAST([values] AS INT)) FROM #TEMP GROUP BY catgory -- 合并子分类的明细行 UNION ALL SELECT NEW = sub_category, Value = CAST([values] AS INT) FROM #TEMP -- 指定排序规则:分类行在前,同一分类下子分类按名称排序 ORDER BY catgory, CASE WHEN NEW = catgory THEN 0 ELSE 1 END, NEW
代码详细解释
- 汇总行生成:按
catgory分组,对values求和(原表中values是nvarchar类型,必须转换为INT才能计算总和),将分类名称作为NEW列的值。 - 明细行生成:直接取子分类名称作为
NEW列,同时将values转换为数值类型作为Value。 - UNION ALL合并:用
UNION ALL而非UNION,因为两类数据不会有重复行,这样效率更高。 - 排序逻辑:
- 先按
catgory排序,确保同一分类的所有行聚在一起; - 用
CASE语句标记汇总行(赋值0)和明细行(赋值1),让汇总行优先排在前面; - 最后按
NEW列排序,保证子分类按名称有序排列。
- 先按
执行后预期输出
| NEW | Value |
|---|---|
| Bird | 15 |
| parrot | 5 |
| pigeon | 10 |
| Animal | 7 |
| lion | 2 |
| Tiger | 5 |
注意事项
- 如果你的真实表中
values列已经是数值类型(比如INT),可以去掉CAST([values] AS INT)转换; - 注意临时表的列名拼写是
catgory(少了一个字母e),如果是笔误,记得改成正确的category。
内容的提问来源于stack exchange,提问作者pinky adhikari
相关产品推荐
相关产品推荐

