SSRS中如何回顾性过滤行:仅展示有未完成任务员工的所有任务记录
SSRS 需求实现方案
需求1:隐藏全部任务均为Completed的员工的所有记录
提供两种实现方式,可根据实际场景选择:
方式1:数据集层面实现(推荐,性能更优)
在数据集的查询SQL中新增员工维度的标记字段,再过滤全完成的员工即可,不会过滤掉有Open任务的员工的Completed任务行:
SELECT [Worker ID], [Task Name], [Task Status], -- 标记该员工是否存在至少1个Open任务 MAX(CASE WHEN [Task Status] = 'Open' THEN 1 ELSE 0 END) OVER (PARTITION BY [Worker ID]) AS has_open_task, -- 标记该员工是否仅Task-4为Open(用于需求3统计) CASE WHEN SUM(CASE WHEN [Task Name] IN ('Task-1','Task-2','Task-3') AND [Task Status] = 'Completed' THEN 1 ELSE 0 END) OVER (PARTITION BY [Worker ID]) =3 AND SUM(CASE WHEN [Task Name] = 'Task-4' AND [Task Status] = 'Open' THEN 1 ELSE 0 END) OVER (PARTITION BY [Worker ID]) =1 THEN 1 ELSE 0 END AS is_only_task4_open FROM 你的业务表名 -- 仅保留存在Open任务的员工的所有行 WHERE MAX(CASE WHEN [Task Status] = 'Open' THEN 1 ELSE 0 END) OVER (PARTITION BY [Worker ID]) =1
方式2:SSRS报表端实现(无需修改SQL查询)
给报表按Worker ID创建行组,设置行组的可见性表达式为:
=IIF(CountDistinct(IIF(Fields!Task_Status.Value = "Open", 1, Nothing), "你的WorkerID行组名称") = 0, True, False)
该表达式会判断当前员工分组下是否没有Open任务,是则隐藏整个分组的所有行。
需求3:统计仅Task-4为Open状态的员工总数
若已采用上述数据集层面方案
直接用以下统计表达式即可:
=CountDistinct(IIF(Fields!is_only_task4_open.Value = 1, Fields!Worker_ID.Value, Nothing), "你的数据集名称")
若不想修改数据集,直接在报表端统计
使用Lookup函数匹配同员工的4个任务状态判断,表达式如下:
=CountDistinct( IIF( Lookup(Fields!Worker_ID.Value & "-Task-1", Fields!Worker_ID.Value & "-" & Fields!Task_Name.Value, Fields!Task_Status.Value, "你的数据集名称") = "Completed" AND Lookup(Fields!Worker_ID.Value & "-Task-2", Fields!Worker_ID.Value & "-" & Fields!Task_Name.Value, Fields!Task_Status.Value, "你的数据集名称") = "Completed" AND Lookup(Fields!Worker_ID.Value & "-Task-3", Fields!Worker_ID.Value & "-" & Fields!Task_Name.Value, Fields!Task_Status.Value, "你的数据集名称") = "Completed" AND Lookup(Fields!Worker_ID.Value & "-Task-4", Fields!Worker_ID.Value & "-" & Fields!Task_Name.Value, Fields!Task_Status.Value, "你的数据集名称") = "Open", Fields!Worker_ID.Value, Nothing ), "你的数据集名称" )
注:将表达式中「你的数据集名称」「你的WorkerID行组名称」替换为实际报表中对应的名称即可。
内容的提问来源于stack exchange,提问作者user15482189
相关产品推荐
相关产品推荐

