sql - 具有基于 GROUPING SETS 的数据集的展开-折叠报告

标签 sql sql-server reporting-services

我用过the Expand/Collapse feature在之前的 SSRS 报告中,但在所有这些情况下,都是报告服务负责分组和总计。这次,我在数据集查询中使用 GROUPING SETS 来让 SQL Server 处理数据聚合。我想创建一个具有组展开/折叠功能的报告,但似乎无法使其正常工作。

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

-- 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

到目前为止我尝试过的:

在编写这个问题并创建重现时,我确实意识到我将数据集转储到 tablix 中的第一种方法是错误

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

Row Groups pane in SSRS

除此之外,我还需要在主组的左侧外部有一列来保存总计行的切换“+”。

但是,这给出了折叠版本的错误数字:

preview of report, collapsed

这些应该不同:蛋糕和水果的“小计”分别为 3 和 4。

这似乎是行排序的问题,因此我检查了 Tablix 的排序,并且应该按照“预期结果”中出现的方式对行进行排序” 截图。事实并非如此,过了一会儿我明白了原因:这些组也会进行排序。所以我也为组添加了排序,例如这是 Product 行组的行组:

SSRS sorting for Product Row Group

这似乎改善了事情(无论如何它都完成了我需要的排序),但它并不能解决折叠状态下的错误数字的问题。

我需要做什么才能完成最后阶段并完成报告?

最佳答案

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

report design

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

=Fields!NrOfBuyers.Value

但这偷偷摸摸似乎可以归结为:

=First(Fields!NrOfBuyers.Value)

当它在折叠行的上下文中计算时。

因此,“修复”此问题并获得正确小计的一种方法是将该表达式更改为:

=Last(Fields!NrOfBuyers.Value)

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

completely collapsed

或半折叠:

semi-collapsed

最后,扩展:

Expanded result

关于sql - 具有基于 GROUPING SETS 的数据集的展开-折叠报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23738733/

相关文章:

sql - 报表生成器中的可见性表达式

sql - 根据分组依据获取有限的数据

java - 过滤请求JPQL(查找列表中不包含具有特定id的元素的条目)

reporting-services - 当报表上没有可显示的行时,如何显示 'No data available.'?

mysql - 查找表中没有关系的行

sql - 如何使用sql获取最大连续行数

javascript - 谷歌图表工具提示不工作

sql-server - 奇怪的 WHERE col = NULL 行为

reporting-services - 如何在 SSRS Report Builder 中按日期范围分组?

reporting-services - SSRS 参数 IIF 表达式