如何在Report Builder矩阵中计算行计数占列总和的百分比?
我明白你遇到的问题了——在Matrix里计算每行Total占总合计的百分比时,总是得到1,这是因为聚合函数的作用域没设置对,导致分母和分子取的是同一个范围的值。下面我一步步给你解决方法:
问题根源
你之前用的表达式比如=Count(Fields!Visits.Value)/Sum(Count(Fields!Visits.Value)),默认情况下Sum的作用域是当前的Names行组,所以分子是当前行的计数,分母也是当前行的合计,结果自然是1。我们需要让分母取整个数据集(或整个矩阵)的总合计才行。
正确的解决方案
第一步:确认Total列的表达式
首先确保你的Total列计算正确,它应该是当前行中Visit1和Visit2的计数之和,表达式用:
=Sum(Count(Fields!Visits.Value))
这里的Sum会自动把同一行下两个列组(Visit1、Visit2)的Count结果相加,得到每行的Total(比如Adam的7)。
第二步:计算百分比的正确表达式
在你新增的百分比列中,使用以下表达式(把DataSet1换成你实际的数据集名称,或者直接用矩阵的名称,比如你的矩阵叫Matrix1就写"Matrix1"):
=Sum(Count(Fields!Visits.Value)) / Sum(Count(Fields!Visits.Value), "DataSet1")
- 分子
Sum(Count(Fields!Visits.Value)):取当前行的Total值 - 分母
Sum(Count(Fields!Visits.Value), "DataSet1"):指定作用域为整个数据集,这样就能得到所有行的Total总和(也就是你示例里的20)
第三步:设置百分比格式
光有表达式还不够,需要把单元格格式改成百分比:
- 右键百分比列的单元格,选择「格式单元格」
- 在「数字」选项卡中选择「百分比」,设置小数位数为0(根据你的需求调整)
- 点击确定,运行报表就能看到正确的百分比了。
替代方案(引用Total列的值)
如果你已经正确设置了Total列,也可以直接引用Total列的值来计算,记得要给Total列设置一个名称(在报表设计器的属性面板里,把Total列的Name属性设为Total),然后百分比列的表达式写成:
=ReportItems!Total.Value / Sum(Count(Fields!Visits.Value), "DataSet1")
这样更直观,效果和上面的方法一致。
验证结果
运行后你应该能得到和示例一样的结果:
Names Visit1 Visit2 Total Percentage
Adam 5 2 7 35%
Mick 3 1 4 20%
Robert 1 1 2 10%
Anna 4 3 7 35%
Total 20
内容的提问来源于stack exchange,提问作者user10099944

