我们希望在Reporting Services环境中使用多个层次结构作为参数。
即。
**SalesRegion** -- **Country**
Americas -- Canada
Americas -- United States
APAC -- Australia
APAC -- Japan
EMEA -- Germany
EMEA -- United Kingdom
我们实施了参数,允许我们的用户为SalesRegions
和Country
选择一个或多个区域(以及"全选"选项)。然后,报告将根据用户的选择显示特定的销售数据,以及一系列图表(导致管理人员如图表)。
典型的情况是区域经理选择他或她的区域,然后是一些重点国家。但是,我们也使用相同的报告进行顶级管理,并且他们对整体概述更感兴趣,因此通常会选择"全选" SalesRegion
和Country
的选项。
不幸的是,我们使用WHERE
子句对IN
和SalesRegion
使用Country
子句进行查询设置,因此报告很乐意将每个国家/地区吐出来进行了一次销售,导致大量的数据和图表被排成一条线。
在用户选择Select all
作为参数的情况下,是否可以以某种方式显示汇总数字?我并不反对使用包含所有汇总数字的第二个数据集,但不知道如何将其作为报告的基础,并且选择全部"选择全部"被选中了。
答案 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值。)然后在您的数据集中报告,将此新列用作父组。
因此,如果用户选择所有销售区域,则默认情况下使用此新列对数据进行分组(对于数据集中的所有行,该列将设置为“全部”),然后仍然允许他们将此扩展到个人他们如此渴望的水平。