我想在 SQL Server Reporting Services 2008 中有一个图表显示前 X 值,并将其余的总和/分组为其他值。如果不在 T-SQL 中进行分组,这可能吗?
例子:
查询返回美国 50 个州的总销售额。我想显示销售额最高的五个州,并将其余的州与其销售额的总和归为“所有其他州”。
用户将能够按任意数量的状态进行过滤,我需要图表来显示所选状态的前 5 个。
我想缓存所有状态的报告执行,并从快照中呈现报告。
我想在 SQL Server Reporting Services 2008 中有一个图表显示前 X 值,并将其余的总和/分组为其他值。如果不在 T-SQL 中进行分组,这可能吗?
例子:
查询返回美国 50 个州的总销售额。我想显示销售额最高的五个州,并将其余的州与其销售额的总和归为“所有其他州”。
用户将能够按任意数量的状态进行过滤,我需要图表来显示所选状态的前 5 个。
我想缓存所有状态的报告执行,并从快照中呈现报告。
最简单的方法是使用 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 变量为零,并且您的计算不起作用。但是,详细信息行现在已适当隐藏。
这就是为什么您需要在 Detail 带中进行计算并隐藏所有其他结果而不是在 Footer 带中进行计算,这似乎是合乎逻辑的。