代码之家  ›  专栏  ›  技术社区  ›  Rob Boek

是否有办法让SSR2008图表显示前X个结果,并将其余结果分组/求和?

  •  0
  • Rob Boek  · 技术社区  · 16 年前

    我希望在SQL Server Reporting Services 2008中有一个图表,显示前x个值,其余的值和/分组。在T-SQL中不进行分组是否可能?

    例子:

    一个查询返回50个美国州的总销售额。我想展示销售最多的五个州,并将其余州分组为“所有其他州”,以及它们的销售总额。

    用户将能够按任意数量的状态进行筛选,我需要图表来显示所选的前5个状态。

    我希望缓存所有状态下报表的执行,并从快照中呈现报表。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Chris Latta    16 年前

    最简单的方法是在SQL本身中。考虑到您希望从缓存数据中运行报表,这不是一个选项。

    下一个显而易见的方法是用定制代码来实现。您可以执行以下操作:

    右键单击布局空间,选择“属性”,然后单击“代码”选项卡。输入以下代码:

    Public Dim RowCount As Integer = 0
    Public Dim Top5Sum As Double = 0
    
    Public Function HideThisRow(Value As Double) As Boolean
      RowCount = RowCount + 1
      if RowCount > 5 Then
        Return True
      Else
        Top5Sum = Top5Sum + Value
        Return False
      End If
    End Function
    

    在细节栏上,创建两个细节行-第一个是普通行,在该行中,将字段与具有此表达式的该细节行的Visibility Hidden属性相加:

    =Code.HideThisRow(Fields!YourFieldToSum.Value)
    

    这将执行上面的代码,因为它准备显示每个细节行并隐藏除前5行以外的所有行。它还具有前5个值求和的副作用。

    您的详细信息栏中的第二行是我们将在其中显示“所有其他状态”部分的位置,因此请为其提供描述“所有其他状态”,在您具有状态名称的列中,以及在您显示字段的列中,具有表达式:

    =Sum(Fields!YourFieldToSum.Value) - Code.Top5Sum
    

    除了最后一行(第5行)之外,我们还必须为所有行隐藏此行,因此我们将其Visibility Hidden属性设置为以下表达式:

    =IIF(RowNumber(Nothing) = 5, False, True)
    

    这有效地隐藏了除最后一行(第5行)之外的所有行的此行。

    您可能会认为您可以在报表的底部执行此操作,而不是隐藏所有行,但有一个陷阱-您无法预测报表的生成顺序,从而无法预测代码的执行顺序。真的?

    如果您只是使用页脚中的计算而不是隐藏的详细信息行来完成报表,那么TOP5SUM变量的值将得到适当的计算。但是,visibility hidden函数将不起作用(至少在我的ssrs版本上是这样的——在生成准确的页脚之前,它在我的测试中生成了17个空白页)。但是,假设您要计算每个状态所占的百分比,因此将以下表达式添加到您的详细信息带中:

    =Fields!YourFieldToSum.Value / SUM(Fields!YourFieldToSum.Value)
    

    这是一件非常合理的事情,但这完全改变了报表的计算顺序-在这种情况下,细节栏需要知道字段的和,因此页脚栏在细节栏之前计算,这意味着在计算页脚栏时,Top5Sum变量为零,而您的计算离子不起作用。但是,现在细节行被适当隐藏。

    这就是为什么您需要在细节栏中进行计算并隐藏所有其他结果,而不是像逻辑上那样在页脚栏中进行计算。