我用过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 中实现的目标。
预期结果的扩展版本:
预期结果的折叠版本:
到目前为止我尝试过的:
在编写这个问题并创建重现时,我确实意识到我将数据集转储到 tablix 中的第一种方法是错误。
所以我试图解决这个问题是使用正确的行组重新创建 tablix,如下所示:
除此之外,我还需要在主组的左侧外部有一列来保存总计行的切换“+”。
但是,这给出了折叠版本的错误数字:
这些应该不同:蛋糕和水果的“小计”分别为 3 和 4。
这似乎是行排序的问题,因此我检查了 Tablix 的排序,并且应该按照“预期结果”中出现的方式对行进行排序” 截图。事实并非如此,过了一会儿我明白了原因:这些组也会进行排序。所以我也为组添加了排序,例如这是 Product
行组的行组:
这似乎改善了事情(无论如何它都完成了我需要的排序),但它并不能解决折叠状态下的错误数字的问题。
我需要做什么才能完成最后阶段并完成报告?
最佳答案
该方法可行,但需要最后一步才能获得折叠状态的正确数字。通过问题中的示例知道此设计:
显示此单元格的以下表达式:
=Fields!NrOfBuyers.Value
但这偷偷摸摸似乎可以归结为:
=First(Fields!NrOfBuyers.Value)
当它在折叠行的上下文中计算时。
因此,“修复”此问题并获得正确小计的一种方法是将该表达式更改为:
=Last(Fields!NrOfBuyers.Value)
这将在折叠状态下提供所需的输出:
或半折叠:
最后,扩展:
关于sql - 具有基于 GROUPING SETS 的数据集的展开-折叠报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23738733/