Reporting services SSRS中的双分组+导出

Reporting services SSRS中的双分组+导出,reporting-services,ssrs-grouping,Reporting Services,Ssrs Grouping,我正在尝试创建一个报告,它不仅允许用户选择分组依据的字段,还允许用户选择第二级分组。演示-查询的记录是人员的时间表条目。因此,每个记录都有一些字段,例如员工工作时间的员工、工作时间所在的公司、工作项目、完成工作的活动类型,当然还有工作时间。这里有更多的字段,但对于这个例子来说已经足够了 假设一些记录是: 约翰·史密斯,ABC公司,项目X,活动X,10 约翰·史密斯,ABC公司,项目X,活动Y,5 约翰·史密斯,ABC公司,项目Y,活动X,8 约翰·史密斯,FGH公司,项目Y,活动Y,6 简·琼斯

我正在尝试创建一个报告,它不仅允许用户选择分组依据的字段,还允许用户选择第二级分组。演示-查询的记录是人员的时间表条目。因此,每个记录都有一些字段,例如员工工作时间的员工、工作时间所在的公司、工作项目、完成工作的活动类型,当然还有工作时间。这里有更多的字段,但对于这个例子来说已经足够了

假设一些记录是:

约翰·史密斯,ABC公司,项目X,活动X,10 约翰·史密斯,ABC公司,项目X,活动Y,5 约翰·史密斯,ABC公司,项目Y,活动X,8 约翰·史密斯,FGH公司,项目Y,活动Y,6 简·琼斯,ABC公司,项目X,活动X,4 简·琼斯,ABC公司,项目Y,活动Y,8 简·琼斯,FGH公司,项目Y,活动X,7 简·琼斯,FGH公司,项目X,活动Y,6

等等

报表用户可以选择按人员分组,其次是按项目分组,他们会得到以下结果:

John Smith Project X 15 Project Y 14 Jane Jones Project X 10 Project Y 14 或者他们可以通过项目、活动或任何他们喜欢的领域组合进行选择。我将一个表嵌套在另一个表中,并将分组放在这两个表上,这样做效果很好

除了…它不会导出到Excel。我们在2005年,从我所能看到的来看,它在2008年仍然不起作用。在那之后我不确定。无论如何,在我需要发布此报告时,我们不可能升级

我还可以如何实现这一点?我试图想出一些方法来在查询中进行第一级分组,但即使使用动态SQL,我也无法想出如何使其适用于参数传入的任何字段,因为它需要能够为第一级分组返回其他字段

我认为子报表在理论上是可行的,只是整个事情都是子报表,我不知道你是否可以将它们分层。而且我怀疑开销会很糟糕


谢谢大家!

尝试在动态SQL查询中执行所有分组-类似于:

="select " + 
 Parameters!ReportParameter1.Value + " firstCol, " +
 Parameters!ReportParameter2.Value + " secondCol, " +
 "sum(hours_worked) total_hours from timesheets " +
 "group by " + 
 Parameters!ReportParameter1.Value + ", " +
 Parameters!ReportParameter2.Value

您不需要使用嵌套表来实现这一点。您只需要一个表,其中包含两个组和两个参数GROUPBY 1和GROUPBY 2,其中参数值是数据集中列的名称

e、 g.按1个参数分组

value         label
------        -------
staff         Staff Member
project_name  Project
然后将第一个组的组表达式设置为:

=Fields(Parameters!GroupBy1.Value).Value
=Fields(Parameters!GroupBy2.Value).Value
第二组的组表达式为:

=Fields(Parameters!GroupBy1.Value).Value
=Fields(Parameters!GroupBy2.Value).Value

嗯……我用两组分组值project和activity尝试了这个方法,目前只是为了测试在查询中分组的想法,而不是在表本身上分组。它正在工作,尽管我仍然需要动态测试它。我想我不知道/仍然不理解的是-查询中的分组是否自动应用于它在表中的显示/格式本身?似乎是的,但我只是想确定我明白它在做什么。谢谢我搞不懂使这个动态的语法。我的理解是,这类似于注释-在代码中使用at代替at符号:DECLARE atTmpQuery varchar800 set atTmpQuery='选择时间表。分钟作为时间,+atGroup_by+'作为Group_by来自时间表'execatTmpQuery'我知道这对于注入来说不是很好,但是1。我无法理解SSRS和2中的sp_executesql。这仅适用于不在网络上的计算机,但是,它只返回组_by的my字段的名称,而不是该字段中的值。我想不出如何更好地格式化它。很抱歉不管怎样,我也用参数试过了!Group_by.value代替atGroup_by,并显示“附近语法不正确!”@teleute00:我建议的不是在t-sql中构造动态查询,而是在SSRS中为查询执行表达式中的所有动态部分,如上所述-这两个参数对应于两个分组项。因此,例如,如果这两个参数的值为userName和companyName,则查询字符串的计算结果将选择userName firstCol、companyName secondCol、sumhours\u worked total\u hours from timesheets group by userName、companyName。报表可用的字段始终是firstCol、secondCol和hours_worked。目前,我是按照上面的方式工作的,但我想我会在有时间的时候再讨论这个问题,因为我想知道在查询中分组是否比在表中分组更快。所以,基本上你是说-不要像这样使用动态SQL…基本上把SSRS数据集窗口当作我用PHP或其他脚本语言编写查询一样对待?抱歉,如果这是一个愚蠢的问题-我对SSRS非常陌生,只是边走边捡东西…我应该补充一点,这假设您的数据没有预先分组,即您的报表数据集看起来像您问题中的记录。如何在没有嵌套表的情况下放置两个分组?这是我唯一能让它工作的方法…哎呀-没关系。整理好了。基本上我就是这样 我本来想做,但做得不对。我放弃了,因为我甚至不知道它会起作用。现在我知道这是正确的方向,现在我对SSRS更为熟悉,我让它按需要工作。谢谢