【问题标题】:Group by column & row in one part of expression, group by column only in another part of expression在表达式的一部分中按列和行分组,仅在表达式的另一部分按列分组
【发布时间】:2016-03-16 20:59:23
【问题描述】:

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

这是我现有的表达方式:

=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 表达式中完成这一切。

编辑 样本数据:

看起来像这样。背景是这些分组是天数,而“全部”是票数,所以我们试图看看谁在他们的票上坐得更久。

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

编辑 2

这是一个完整的样本数据集:

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

我需要按月和按年进行分组,并且我不想在分组行中看到“排除”,但是如果不从总体人口中删除它们就不能从 tablix 中过滤出来,这是必需的分母。

【问题讨论】:

  • 分享样本数据和预期结果以帮助您。
  • ALL 行是如何计算的?我看到这是一个不同的 ID 计数,但在哪个范围内?如果您共享原始数据集而不探索复制您的场景会更好。
  • 那很好,是的。擦洗需要时间。 All 是门票的数量,这些门票可以随时归属于 3 个不同的组。因此,All 是按月计算的票数,而 Groups 是按月和按组计算的票日总和。

标签: reporting-services ssrs-2012 reportbuilder3.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 函数中限定多个组。

首先我没有过滤数据集,我更喜欢在Row Visibility 窗口的Hidden 属性中使用以下表达式隐藏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)

Group2 替换为您的案例中创建的组的名称。

这是您的场景的完整再现:

如果这有帮助,请告诉我。

【讨论】:

  • 这很有帮助,但会导致我之前没有透露的问题:我正在过滤掉被归类为“排除”的组。这最终会从数据集中排除,而不仅仅是生成的 tablix。有没有办法让我在不过滤数据的情况下隐藏 tablix 中的组?
  • 我遇到的另一个问题是受限于单个分组。为简单起见,我仅在示例中使用了“月”,但理想情况下,我希望使用月和年,但表达式仅限于单个组。最终并不理想。
  • 编辑您的问题并包含这些详细信息,我认为您可以实现您所描述的,但您必须提供完整的数据样本以及您的条件和预期结果的详细信息。
  • 我将继续并将其标记为答案。它变得太复杂了,不可行,我认为在 SQL 端做这件事要清楚得多。
  • @n8。检查我的版本,我建议您在 T-SQL 中生成所需的聚合,但是这是您可以使用的问题的 SSRS 解决方案。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 2017-09-16
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多