包含基于GROUPING SETS的数据集的展开折叠报告

时间:2014-05-19 13:13:52

标签: sql sql-server reporting-services

之前我在SSRS报告中使用过the Expand/Collapse feature,但在所有这些情况下, Reporting Services 正在进行分组和总计。这次我在我的数据集查询中使用GROUPING SETS让SQL Server处理聚合数据。我想创建一个具有群组扩展/折叠功能的报告,但似乎无法使其生效。

摄制
首先,这是一种模拟我的实际情况的小型repro的方法。对数据集使用以下查询:

-- Simulating with already denormalized data for sake of simplicity
DECLARE @Order TABLE (Category VARCHAR(20), Product VARCHAR(20), PersonId INT);

INSERT INTO @Order
        (Category, Product, PersonId)
VALUES  ('Fruit', 'Banana', 1)
       ,('Fruit', 'Banana', 1)
       ,('Cakes', 'Chocolate', 1)
       ,('Fruit', 'Apple', 2)
       ,('Cakes', 'Chocolate', 2)
       ,('Cakes', 'Berry Jam', 3)
       ,('Cakes', 'Chocolate', 3)
       ,('Cakes', 'Chocolate', 3)
       ,('Fruit', 'Banana', 4)
       ,('Cakes', 'Berry Jam', 5)

SELECT Category,
       Product,
       COUNT(DISTINCT PersonId) AS NrOfBuyers 
FROM @Order AS o
GROUP BY GROUPING SETS ((), (Category), (Category, Product))

这将提供此输出(我已手动命令输出以说明我的意图):

Category    Product     NrOfBuyers
--------    -------     ----------
Fruit       Apple       1
Fruit       Banana      2
Fruit       NULL        3
Cakes       Berry Jam   2
Cakes       Chocolate   3
Cakes       NULL        4
NULL        NULL        5

预示我的目标,这就是我想要在Excel中获得的内容。

预期结果的扩展版本:

expanded report result

预期结果的折叠版本:

collapsed report result

到目前为止我尝试过的事情:

在撰写此问题并创建repro时,我确实意识到我的第一种方法是将数据集转储到Tablix中错误

所以我试图解决的问题是使用正确的行组重新创建Tablix,如下所示:

Row Groups pane in SSRS

除此之外,我需要左侧的一列外面主要组来保持切换" +"总排。

但是,这会为折叠版本提供错误的数字:

preview of report, collapsed

这些应该是不同的:蛋糕和水果有一个"小计"分别为3和4。

这似乎是排序行的问题,所以我检查了Tablix的排序,并且订购行,因为出现在&中#34;预期结果"截图。它没有,稍后我明白了原因:这些小组也做了排序。所以我也为这些群组添加了排序,例如这是Product行组的一个:

SSRS sorting for Product Row Group

这似乎可以改善一些事情(它确实是我需要的排序位)但是它并没有解决在折叠状态下错误的数字。

完成最后一段时间并完成报告需要做些什么?

1 个答案:

答案 0 :(得分:2)

该方法可行,但需要最后一步才能获得折叠状态的正确数字。知道这个设计问题的例子:

report design

显示此单元格的以下表达式:

=Fields!NrOfBuyers.Value

但是这个偷偷摸摸似乎归结为:

=First(Fields!NrOfBuyers.Value)

在折叠行的上下文中进行评估时。

所以,一种方法来修复"这个并获得正确的子总数是将该表达式更改为:

=Last(Fields!NrOfBuyers.Value)

这将在折叠状态下提供所需的输出:

completely collapsed

或半崩溃:

semi-collapsed

最后,扩展了:

Expanded result