如何在SSRS中旋转报表(行列互换)及数据适配问题
解决SSRS矩阵行列互换与行头匹配问题
第一步:修改数据源结构(推荐方案)
你的存储过程当前输出的是宽表结构(聚合类型为行,分类为列),但SSRS矩阵更适配长表结构(每行对应一个聚合类型+分类+数值的组合)。建议先调整存储过程,将数据转换为长表格式:
调整后的存储过程逻辑示例
-- 按聚合类型和分类拆分计算汇总值 SELECT AggregationType = 'TicketsReceived', CategoryCode = 'Category1', Total = Sum(Category1) FROM YourSourceTable UNION ALL SELECT AggregationType = 'TicketsReceived', CategoryCode = 'Category2', Total = Sum(Category2) FROM YourSourceTable UNION ALL SELECT AggregationType = 'TicketsResolved', CategoryCode = 'Category1', Total = Sum(Category1) FROM YourSourceTable UNION ALL SELECT AggregationType = 'TicketsResolved', CategoryCode = 'Category2', Total = Sum(Category2) FROM YourSourceTable -- 关联分类描述查找表,替换为友好名称 JOIN CategoryLookup cl ON cl.CategoryCode = t.CategoryCode
调整后输出的每行包含:AggregationType(如TicketsReceived)、CategoryDescription(如"系统故障")、Total(汇总值),完全匹配SSRS矩阵的分组需求。
第二步:配置SSRS矩阵
- 拖拽矩阵控件到报表设计界面
- 行组:拖入
CategoryDescription字段,作为行头展示分类描述 - 列组:拖入
AggregationType字段,作为列头展示聚合类型 - 数据区域:拖入
Total字段,设置聚合方式为Sum(若存储过程已完成汇总,直接取字段值即可)
完成配置后就能得到你期望的报表效果:行是分类描述,列是聚合类型,交叉区域为对应数值。
无法修改存储过程的替代方案
如果因权限或其他限制不能修改存储过程,可在SSRS中通过UNPIVOT转换宽表:
- 打开数据集属性,修改查询语句,用UNPIVOT将列转为行:
SELECT AggregationType, CategoryCode, Total FROM (SELECT * FROM YourStoredProcedureResult) p UNPIVOT (Total FOR CategoryCode IN (Category1, Category2, Category3)) AS unpvt -- 关联分类查找表获取描述 JOIN CategoryLookup cl ON cl.CategoryCode = unpvt.CategoryCode
- 再按照上述矩阵配置步骤,使用转换后的数据集即可实现需求。
为何无法直接实现行列互换?
SSRS矩阵的核心逻辑是基于分组维度:行组和列组都需要明确的分组字段(即每个行/列对应字段的不同取值)。你原有的宽表中,分类是列名而非数据行的字段值,矩阵无法自动将列名识别为分组维度——必须把列名转换为数据行中的字段值,才能作为行组的分组依据。
内容的提问来源于stack exchange,提问作者greendesert69
相关产品推荐
相关产品推荐

