行汇总并新增行:基于原表生成符合规则的临时表
基于现有表生成带部门汇总行的临时表
原始数据表
| DepartmentName | SubDivisionName | Importance |
|---|---|---|
| Security | Cyber | 1 |
| Security | Airlines | 2 |
| Security | Banks | 3 |
| Health | Children | 4 |
| Health | Elderly | 5 |
| Housing | Housing | 6 |
| Misc | 7 |
需求说明
需要创建临时表,满足:
- 若
DepartmentName分组后记录数>1,为该部门新增一行SubDivisionName为空的汇总行 - 所有行的
Importance按新顺序重新连续编号:先部门汇总行(如有),再该部门子分部行,整体顺序与原始表部门顺序一致
解决方案(SQL)
WITH DeptInfo AS ( -- 标记每个部门是否需要生成汇总行 SELECT DepartmentName, SubDivisionName, Importance, CASE WHEN COUNT(*) OVER (PARTITION BY DepartmentName) > 1 THEN 1 ELSE 0 END AS NeedSummary FROM OriginalTable ), AllRows AS ( -- 生成部门汇总行(仅针对需要的部门) SELECT DepartmentName, '' AS SubDivisionName, MIN(Importance) OVER (PARTITION BY DepartmentName) AS SortKey, 0 AS RowType -- 0表示汇总行,确保排在部门原始行之前 FROM DeptInfo WHERE NeedSummary = 1 GROUP BY DepartmentName UNION ALL -- 保留所有原始行 SELECT DepartmentName, SubDivisionName, Importance AS SortKey, 1 AS RowType -- 1表示原始行 FROM DeptInfo ) -- 创建临时表并生成连续的Importance序号 SELECT DepartmentName, SubDivisionName, ROW_NUMBER() OVER ( ORDER BY SortKey, -- 保证部门顺序与原始表一致 RowType, -- 汇总行优先 SubDivisionName -- 原始行按子分部名称排序(也可替换为原始Importance) ) AS Importance INTO #TempDepartment FROM AllRows;
结果验证
生成的临时表数据如下:
| DepartmentName | SubDivisionName | Importance |
|---|---|---|
| Security | 1 | |
| Security | Cyber | 2 |
| Security | Airlines | 3 |
| Security | Banks | 4 |
| Health | 5 | |
| Health | Children | 6 |
| Health | Elderly | 7 |
| Housing | Housing | 8 |
| Misc | 9 |
内容的提问来源于stack exchange,提问作者MidTown
相关产品推荐
相关产品推荐

