SSRS 2016层级行组非预聚合度量列正确取值方案咨询
可行解决方案(两种均在SSRS 2016环境验证可用)
方案1:传统嵌套行组+LOOKUP取值(推荐,无需修改存储过程)
你提到的第一种思路完全可以实现,操作步骤如下:
- 数据集层面新增辅助计算字段
在SSRS数据集设计界面添加2个计算字段(不需要修改原有存储过程):
LevelFlag,表达式:=IIF(IsNothing(Fields!City.Value), "State", IIF(IsNothing(Fields!Location.Value), "City", "Location"))
作用是标识当前行对应的层级。RowUniqueKey,表达式:=Fields!State.Value & "|" & Fields!City.Value & "|" & Fields!Location.Value
作用是作为唯一匹配键,避免跨州重名城市匹配错误。
- 配置嵌套行组
插入空白Tablix绑定到当前数据集,依次创建3个嵌套行组,从上到下分组依据分别为State字段、City字段、Location字段,明细行对应点位层级。
在Tablix的筛选规则中添加如下两个筛选条件,过滤掉预制的州、城市级汇总行,避免重复显示:
- 第一个筛选:表达式
=Fields!LevelFlag.Value,运算符不等于,值State - 第二个筛选:表达式
=Fields!LevelFlag.Value,运算符不等于,值City
- 配置度量列取值表达式
不同层级的度量单元格分别写对应取值表达式,直接拉取存储过程计算的原始值,不会触发自动聚合:
- 州组对应的度量单元格:
=LOOKUP(Fields!State.Value & "||", Fields!RowUniqueKey.Value, Fields!Measure.Value, "你的数据集名称")
这里的||对应City和Location为NULL的情况,匹配你预制的州级汇总行。 - 城市组对应的度量单元格:
=LOOKUP(Fields!State.Value & "|" & Fields!City.Value & "|", Fields!RowUniqueKey.Value, Fields!Measure.Value, "你的数据集名称")
匹配你预制的城市级汇总行。 - 点位明细行的度量单元格直接绑定
=Fields!Measure.Value即可。
- 配置折叠交互
- 选中City行组,在属性面板「可见性」栏目设置初始可见性为「隐藏」,切换项选择州组对应的州名显示文本框。
- 选中Location行组,同样设置初始可见性为「隐藏」,切换项选择城市组对应的城市名显示文本框。
方案2:递归层级行组(适合层级复杂的场景,需要轻微调整存储过程)
如果不想写大量LOOKUP表达式,可以在存储过程中为每行数据增加RowID和ParentRowID两个字段,构建父子层级关系:
示例调整后的数据集结构:
RowID ParentRowID State City Location Measure 1 0 FL NULL NULL 25 2 1 FL Miami NULL 12 3 2 FL Miami Walmart 52 4 2 FL Miami Kmart 3 5 1 FL Orlando NULL 33 6 5 FL Orlando Sears 4
之后在Tablix中创建单个递归行组:
- 分组依据设置为
RowID字段 - 父组设置为
ParentRowID字段 - 度量列直接绑定
=Fields!Measure.Value - 可见性切换直接使用递归组自带的折叠配置即可,无需额外写表达式。
内容的提问来源于stack exchange,提问作者Tab Alleman
相关产品推荐
相关产品推荐

