在表达式的一部分按列和行分组,在表达式的另一部分仅按列分组

Group by column & row in one part of expression, group by column only in another part of expression

我正在尝试找到一种使用 Group By 功能创建 table 的方法,其中分数的分子按列和行分组,而分母仅按列。

这是我现有的表达式:

=Round(Sum(Fields!Days_In_Step.Value)/CountDistinct(Fields!ID.Value),1, MidpointRounding.AwayFromZero)

按行 (groupName) 和列 (month/year) 分组时,分子 (Sum(Fields!Days_In_Step.Value)) 提供了良好的数据,但分母 (CountDistinct(Fields!ID.Value)) 也按行分组(groupName) 我不想这样。

我有一个 SQL 解决方案,但如果可能的话,我正在尝试在 SSRS 表达式中完成整个过程。

编辑 示例数据:

看起来像这样。背景是这些分组是天数,"all" 是票数,所以我们试图看看谁在票上坐的时间更长。

这是一个模型,包括使用数据透视表的示例数据集 table:

编辑 2

这是一个完整的示例数据集:

https://docs.google.com/spreadsheets/d/1rYPMcrLNB-FZN64Fn2-y3FtnM2iQo2VMH7YTdfiVnKM/edit?usp=sharing

我需要按月和年进行分组,我不想在组行中看到 "Exclude",但是如果不从总体中删除它们就无法从 tablix 中过滤掉,这是分母所必需的。

您的问题是由聚合函数的作用域引起的。当您使用聚合函数时,它们 运行 在默认情况下放置在 tablix 中的范围内。在您的情况下,Sum()CountDistinct() 函数在行组(所有者组)和列组(月组)中都是 运行ning。

幸运的是,您可以指定聚合函数计算聚合的范围,只需在函数中添加组名即可:

CountDistinct(Fields!ID.Value,"MonthGroup")

整个表达式是这样的:

=Round(Sum(Fields!Days_In_Step.Value)/
CountDistinct(Fields!ID.Value, "MonthGroup"),1, MidpointRounding.AwayFromZero)

Replace "MonthGroup" by the actual name of your group in columns group.

这是使用您提供的样本数据的结果:

我用这个表达式来告诉你它是如何产生的:

=Sum(Fields!Days.Value) & "/" 
& CountDistinct(Fields!Ticket.Value,"MonthGroup") & "=" &
Sum(Fields!Days.Value)/CountDistinct(Fields!Ticket.Value,"MonthGroup")

Note my column group is named MonthGroup.


更新: 在 CountDistinct 函数中限定多个组。

首先我没有过滤数据集,我更喜欢在 Row Visibility 属性 的 Hidden 属性 window 中使用以下表达式隐藏 Exclude 行]:

=IIF(Fields!Group.Value="Exclude" OR Fields!Group.Value="-1",true,false)

要按月和年而不是按组计算不同的 ID 分组,您可以在月组下面创建一个子组,如下所示:

我的群组名为 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)

Replace Group2 by the name of the created group in your case.

这是您场景的完整重现:

如果有帮助请告诉我。