【问题标题】:How can I use nested aggregation on both row and column groups?如何在行组和列组上使用嵌套聚合?
【发布时间】:2020-07-07 13:31:14
【问题描述】:

我有一个 row 组用于租户(打开分页符)和一个 column 组用于楼层。

数据输出格式如下,如您所见,由于其他数据项 TotalArea 重复,我需要取第一个/最大 TotalArea 并将其添加到每个楼层和租户:

我正在尝试计算占用的总面积(列分组之外),如下所示:

Total Occupied Area 表达式:=SUM(MAX(Fields!TotalArea.Value))

这就是我得到的结果,应该是Level 1 + Level 2 = 8156 m2:

我尝试将 Floor 分组作为参数 =SUM(MAX(Fields!TotalArea.Value,"FloorReference")) 添加,但出现以下错误:

这是否可能,我需要使用一些自定义代码吗?

【问题讨论】:

  • 能否提供完整的查询、预期结果和实际结果以获得更好的帮助?当你使用 sqlfiddle 时会更好
  • @Govind 我已经更新了预期结果和我已经提供的查询结果,但是我无法为您提供查询,因为它来自 CLR 存储过程。

标签: sql-server reporting-services ssrs-2016


【解决方案1】:

虽然这可能直接在 SSRS 中实现,但我通常会直接在数据集查询中计算,然后报告非常简单。

如果您使用的是存储过程并且由于任何原因无法更改它,您仍然可以这样做,我将在下面显示存储过程版本


纯查询版本

我为两个租户模拟了一些数据,每个租户有两个楼层,数据与您的示例相似

然后我只是使用子查询来返回租户的总建筑面积,因此您可以直接在 SSRS 中使用此字段,并使用 FIRST() 或 MAX() 等。

declare @t TABLE(Tenant varchar(20), FloorReference varchar(10), TotalArea float, Value float)

INSERT INTO @t VALUES
('Customer A', 'Lv 1', 4081, 100),
('Customer A', 'Lv 1', 4081, 110),
('Customer A', 'Lv 1', 4081, 120),
('Customer A', 'Lv 1', 4081, 130),
('Customer A', 'Lv 1', 4081, 140),
('Customer A', 'Lv 1', 4081, 150),
('Customer A', 'Lv 2', 4075, 160),
('Customer A', 'Lv 2', 4075, 170),
('Customer A', 'Lv 2', 4075, 180),
('Customer B', 'Lv 1', 1000, 190),
('Customer B', 'Lv 2', 1500, 200)

SELECT 
    t.*,  fa.TenantFloorArea
    FROM @t t
    JOIN (SELECT Tenant, TenantFloorArea = SUM(TotalArea) FROM (SELECT DISTINCT Tenant, FloorReference, TotalArea FROM @t) x GROUP BY Tenant) fa 
        ON t.Tenant = fa.Tenant 

这将为您提供以下结果


存储过程版本

即使您无法更改存储过程,您仍然可以获得结果,然后像这样扩展它们...

CREATE TABLE #t(Tenant varchar(20), FloorReference varchar(10), TotalArea float, Value float)

INSERT INTO #t
    EXEC myStoredProc

SELECT 
    t.*
    ,  fa.TenantFloorArea
    FROM #t t
    JOIN (SELECT Tenant, TenantFloorArea = SUM(TotalArea) FROM (SELECT DISTINCT Tenant, FloorReference, TotalArea FROM #t) x GROUP BY Tenant) fa 
        ON t.Tenant = fa.Tenant 

这将给出完全相同的结果。

【讨论】:

  • 解决此问题的最佳方法是返回 CLR 存储过程并在那里进行计算,感谢您的帮助!
猜你喜欢
  • 2021-04-19
  • 2017-07-16
  • 2017-05-19
  • 1970-01-01
  • 2017-07-26
  • 2018-01-12
  • 2020-11-09
  • 2014-08-10
  • 2015-08-21
相关资源
最近更新 更多