SQL存储过程需求:按Material分组后动态插入Page汇总行
动态SQL透视后插入分组汇总行的实操方案
核心逻辑
用UNION ALL把原有透视数据和分组汇总数据拼在一起,再加个排序标记,让汇总行(比如FB-TOTAL)死死跟在对应分组的Material行后面,不会乱序。
具体操作步骤
1. 生成分组汇总数据
在你原来的动态SQL里加一段聚合代码,针对需要按Page分组的Material,把Material字段改成Page名-TOTAL,数值字段全用SUM求和:
-- 示例汇总片段,要嵌到动态逻辑里 SELECT CONCAT(Page, '-TOTAL') AS Material, Page, SUM(销量) AS 销量, SUM(库存) AS 库存, -- 其他透视出来的列都这么套SUM 1 AS 排序标记 -- 用来控制顺序,让汇总行在分组后面 FROM 你的透视数据源 WHERE Material IN ('FB', '需要分组的其他物料') -- 按需指定要分组的物料 GROUP BY Page
2. 拼接原始数据和汇总数据
把原来的透视查询结果和上面的汇总查询用UNION ALL合并,给原始数据加排序标记=0,这样排序的时候分组行在前,汇总行在后:
-- 完整动态SQL示例,替换成你的实际表和字段 DECLARE @透视列 NVARCHAR(MAX), @动态SQL NVARCHAR(MAX) -- 生成透视列(保留你原来的逻辑就行) SELECT @透视列 = STRING_AGG(QUOTENAME(字段名), ',') FROM 你的透视列数据源 -- 拼整个SQL SET @动态SQL = N' SELECT Material, Page, ' + @透视列 + ', 排序标记 FROM ( -- 原来的透视数据 SELECT Material, Page, ' + @透视列 + ', 0 AS 排序标记 FROM 你的原有透视结果 UNION ALL -- 分组汇总数据 SELECT CONCAT(Page, ''-TOTAL'') AS Material, Page, ' + REPLACE(@透视列, QUOTENAME('字段名'), 'SUM(' + QUOTENAME('字段名') + ')') + ', 1 AS 排序标记 FROM 你的原有透视结果 WHERE Material IN (''FB'', ''其他要分组的物料'') -- 按需改条件 GROUP BY Page ) 临时表 ORDER BY Page, 排序标记, Material' EXEC sp_executesql @动态SQL
3. 适配动态透视列
如果你的透视列是动态生成的,用REPLACE把原始列名替换成SUM(列名),这样不管生成多少列,汇总逻辑都能自动适配。
4. 排除不需要分组的物料
不需要按Page分组的Material,直接在汇总查询的WHERE里排除就行,不会生成多余的汇总行。
内容的提问来源于stack exchange,提问作者Shafi Hussain
相关产品推荐
相关产品推荐

