如何在行组和列组上使用嵌套聚合?
How can I use nested aggregation on both row and column groups?
我有一个 行 租户组(有一个分页符)和一个 列 楼层组。
数据输出采用以下格式,如您所见,由于其他数据项 TotalArea 是重复的,我需要采用 first/max TotalArea 并将每个 Floor 和 Tenant 加在一起:
我正在尝试计算占用的总面积(列分组之外),如下所示:
总占用面积表达式:=SUM(MAX(Fields!TotalArea.Value))
这是我得到的结果,应该是 Level 1 + Level 2 = 8156 m2:
我尝试将 Floor 分组添加为参数 =SUM(MAX(Fields!TotalArea.Value,"FloorReference"))
,但出现以下错误:
这甚至可能吗,我需要使用一些自定义代码吗?
虽然这可能直接在 SSRS 中实现,但我通常会在数据集查询中直接计算,然后报告非常简单。
如果您使用的是存储过程并且由于任何原因无法更改它,您仍然可以这样做,我将在下面显示存储过程版本
纯查询版本
我模拟了两个租户的一些数据,每个租户有两层楼,数据与您的示例相似
然后我只是使用子查询 return 租户的总建筑面积,因此您可以直接在 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
这将给出完全相同的结果。
我有一个 行 租户组(有一个分页符)和一个 列 楼层组。
数据输出采用以下格式,如您所见,由于其他数据项 TotalArea 是重复的,我需要采用 first/max TotalArea 并将每个 Floor 和 Tenant 加在一起:
我正在尝试计算占用的总面积(列分组之外),如下所示:
总占用面积表达式:=SUM(MAX(Fields!TotalArea.Value))
这是我得到的结果,应该是 Level 1 + Level 2 = 8156 m2:
我尝试将 Floor 分组添加为参数 =SUM(MAX(Fields!TotalArea.Value,"FloorReference"))
,但出现以下错误:
这甚至可能吗,我需要使用一些自定义代码吗?
虽然这可能直接在 SSRS 中实现,但我通常会在数据集查询中直接计算,然后报告非常简单。
如果您使用的是存储过程并且由于任何原因无法更改它,您仍然可以这样做,我将在下面显示存储过程版本
纯查询版本
我模拟了两个租户的一些数据,每个租户有两层楼,数据与您的示例相似
然后我只是使用子查询 return 租户的总建筑面积,因此您可以直接在 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
这将给出完全相同的结果。