我试图找到一种方法来使用Group By
功能来创建一个表,其中分数的分子按列和行分组,分母只按列分组。
这是我现有的表达方式:
=Round(Sum(Fields!Days_In_Step.Value)/CountDistinct(Fields!ID.Value),1, MidpointRounding.AwayFromZero)
按行(groupName)和列(月/年)分组时,分子(Sum(Fields!Days_In_Step.Value)
)为我提供了良好的数据,但分母(CountDistinct(Fields!ID.Value)
)也按行(groupName)分组,我不想要那个。
我有一个SQL解决方案,但如果可能的话,我试图在SSRS表达式中完成整个过程。
修改 样本数据:
看起来像这样。背景是这些分组是天数和"所有"是票数,所以我们试图看看谁的票更长。
这是一个模型,包括使用数据透视表的示例数据集:
修改2
以下是完整的示例数据集:
https://docs.google.com/spreadsheets/d/1rYPMcrLNB-FZN64Fn2-y3FtnM2iQo2VMH7YTdfiVnKM/edit?usp=sharing
我需要按月和年分组,我不想看到"排除"在组行中,但是如果没有从总体中移除它们,则不能将它们从Tablix中过滤掉,这是分母所必需的。
答案 0 :(得分:1)
您的问题是由聚合函数的范围引起的。使用聚合函数时,它们在默认情况下放置在Tablix中的范围内运行。在您的情况下,Sum()
和CountDistinct()
函数在两个行组(所有者组)和列组(月组)中运行。
幸运的是,您可以指定聚合函数计算聚合的范围,只需在函数中添加组名称:
CountDistinct(Fields!ID.Value,"MonthGroup")
整个表达式是这样的:
=Round(Sum(Fields!Days_In_Step.Value)/
CountDistinct(Fields!ID.Value, "MonthGroup"),1, MidpointRounding.AwayFromZero)
将
"MonthGroup"
替换为列中实际的组名 基。
这是使用您提供的样本数据的结果:
我已经用这个表达式向你展示了它是如何产生的:
=Sum(Fields!Days.Value) & "/"
& CountDistinct(Fields!Ticket.Value,"MonthGroup") & "=" &
Sum(Fields!Days.Value)/CountDistinct(Fields!Ticket.Value,"MonthGroup")
请注意,我的列组名为
MonthGroup
。
更新:在CountDistinct函数中确定多个组的范围。
首先我没有过滤数据集,我更喜欢使用Exclude
窗口的Hidden
属性中的以下表达式隐藏Row Visibility
行:
=IIF(Fields!Group.Value="Exclude" OR Fields!Group.Value="-1",true,false)
要按月和年计算不同的ID分组,而不是按组计算,您可以在Month组下创建子组,如下所示:
我的小组名为Group2
,我在Group on
文本框中使用了此表达式。
=Fields!End_Month.Value & "-" & Fields!End_Year.Value
它将为每个Month-Year
组合创建一个组。创建组时,它将作为列组添加,因此您必须删除该行,以便系统提示您是否要删除组和行或仅删除行。仅删除离开该组的行。
现在您必须使用的表达式是
=Round(Sum(Fields!Days.Value)/CountDistinct(Fields!ID.Value, "Group2"),1,MidpointRounding.AwayFromZero)
将
Group2
替换为您案例中创建的组的名称。
这是您的场景的全部重现:
如果有帮助,请告诉我。