SSRS:对参数使用“全选”时,显示总计而不是单个记录

时间:2014-10-29 16:37:01

标签: sql-server reporting-services

我们希望在Reporting Services环境中使用多个层次结构作为参数。

即。

**SalesRegion** -- **Country**
Americas -- Canada
Americas -- United States
APAC -- Australia
APAC -- Japan
EMEA -- Germany
EMEA -- United Kingdom

我们实施了参数,允许我们的用户为SalesRegionsCountry选择一个或多个区域(以及"全选"选项)。然后,报告将根据用户的选择显示特定的销售数据,以及一系列图表(导致管理人员如图表)。

典型的情况是区域经理选择他或她的区域,然后是一些重点国家。但是,我们也使用相同的报告进行顶级管理,并且他们对整体概述更感兴趣,因此通常会选择"全选" SalesRegionCountry的选项。

不幸的是,我们使用WHERE子句对INSalesRegion使用Country子句进行查询设置,因此报告很乐意将每个国家/地区吐出来进行了一次销售,导致大量的数据和图表被排成一条线。

在用户选择Select all作为参数的情况下,是否可以以某种方式显示汇总数字?我并不反对使用包含所有汇总数字的第二个数据集,但不知道如何将其作为报告的基础,并且选择全部"选择全部"被选中了。

1 个答案:

答案 0 :(得分:3)

您基本上有三种方法可以实现这一目标:

  • 为“全部”添加显式参数选项(即不是“全选”选项),并在数据集中使用该选项返回不同的结果。
  • 确定用户是否在查询中选择了所有可能的值。
  • 在报告中进行分组。

显式参数选项

假设您的数据集查询类似于

select sum(salesAmt) as TotalSales, Country, SalesRegion
WHERE Country IN ISNULL(@Country, Country) AND SalesRegion IN ISNULL(@SalesRegion, SalesRegion)
GROUP BY Country, SalesRegion

您的SalesRegion(和国家/地区)参数查询看起来像

select Country as Label, Country as Value
From Country
Union
select 'All' as Label, NULL as value

您可以将数据集切换为

    select 
    sum(salesAmt) as TotalSales, 
    CASE WHEN @Country IS NULL THEN 'All' else Country end as Country, 
    CASE WHEN @SalesRegion IS NULL then 'All' else SalesRegion end as SalesRegion
    WHERE Country = ISNULL(@Country, Country) 
AND SalesRegion = ISNULL(@SalesRegion, SalesRegion)
    GROUP BY CASE WHEN @Country IS NULL then 'All' else Country end, 
    CASE WHEN @SalesRegion IS NULL then 'All' else SalesRegion end

现在,如果用户为国家/地区和销售区域选择显式“全部”选项,则会返回所有选项的总计。如果他们为国家/地区选择一个区域而选择全部,则他们会获得该区域的总数

问题当然是你已经失去了你的粒度 - 他们得到了All,那就是那个。当然还有用户培训。

查询黑客

在您的数据集中,添加以下内容:

declare @userSelectedAllContries tinyint;
select @userSelectedAllCountries = 
    case when 
     ( select count(distinct Country) from DataSet)  =
    ( select count(distinct Country) from Dataset where Country in (@Country) ) 
    then 1 else 0 end;

如果用户在多值参数上点击全选,则返回1而不是0,您可以在查询中使用它来聚合并返回不同的数据集。

报告分组

这实质上是上述方法#2的扩展。不要返回不同的数据集,只需将此值作为新列添加到数据集中(更好,而不是返回1或0,如果它为1则返回'All',如果为0则返回Country / SalesRegion值。)然后在您的数据集中报告,将此新列用作父组。

因此,如果用户选择所有销售区域,则默认情况下使用此新列对数据进行分组(对于数据集中的所有行,该列将设置为“全部”),然后仍然允许他们将此扩展到个人他们如此渴望的水平。