如何在SSRS中基于TFS数据集创建按字段名分组的平均时长条形图?
在SSRS中基于宽格式数据集创建状态平均时长条形图的解决方案
我刚好遇到过类似的问题,你的核心困扰在于当前数据集是宽格式(每个状态单独作为一列),而SSRS的条形图需要长格式数据才能把状态名称作为横轴的类别组。直接把三个平均字段放到「值」区域的话,SSRS会把它们当成不同的系列,自然不会显示状态标题。下面给你两种可行的解决方案,优先推荐第一种:
方案1:修改数据集查询,将宽表转成「长格式」(最推荐)
这是最简洁且可扩展的方法,通过调整TFS查询的SQL语句,把原来的三列转成两列(状态名称、时长),让数据结构更适配SSRS图表的需求。
假设你原查询的结果是题目里的三列数据,修改后的SQL可以这样写:
-- 替换YourOriginalQuery为你获取TFS工作项指标的原查询语句 SELECT 'Time in Ready' AS StateName, [Time in Ready] AS Duration FROM YourOriginalQuery UNION ALL SELECT 'Time in Active' AS StateName, [Time in Active] AS Duration FROM YourOriginalQuery UNION ALL SELECT 'Time in Resolved' AS StateName, [Time in Resolved] AS Duration FROM YourOriginalQuery
修改后你的数据集会变成这样的结构:
| StateName | Duration |
|---|---|
| Time in Ready | 6 |
| Time in Ready | 2 |
| Time in Ready | 1 |
| Time in Active | 3 |
| Time in Active | 4 |
| Time in Active | 7 |
| Time in Resolved | 2 |
| Time in Resolved | 1 |
| Time in Resolved | 1 |
接下来配置图表就非常简单了:
- 类别组(Category Group):添加
StateName字段(拖到类别组区域即可) - 值(Values)区域:添加
Duration字段,然后右键该值字段 → 「图表数据属性」→ 「聚合」→ 选择Average(平均值) - 完成后横轴会自动显示三个状态名称,纵轴就是对应的平均时长(和你预期的3、4.7、1.3完全一致)
方案2:不修改原数据集,用SSRS表达式手动映射(应急方案)
如果因为权限或其他原因无法修改原数据集,可以通过自定义状态名称数据集+表达式的方式实现:
- 创建状态名称数据集:在报表中新建一个数据集(比如命名为
StateList),SQL语句写:
SELECT 'Time in Ready' AS StateName UNION ALL SELECT 'Time in Active' UNION ALL SELECT 'Time in Resolved'
- 配置图表类别组:把
StateList里的StateName字段拖到图表的「类别组」区域 - 配置值区域的表达式:在值区域添加一个表达式,根据当前类别组的状态名称,计算对应原数据集列的平均值:
=Switch( Fields!StateName.Value = "Time in Ready", Avg(Fields!Time_in_Ready.Value, "YourOriginalDatasetName"), Fields!StateName.Value = "Time in Active", Avg(Fields!Time_in_Active.Value, "YourOriginalDatasetName"), Fields!StateName.Value = "Time in Resolved", Avg(Fields!Time_in_Resolved.Value, "YourOriginalDatasetName") )
注意:把
YourOriginalDatasetName替换成你实际的原数据集名称;SSRS会自动把带空格的字段名转换成下划线格式(比如Time in Ready变成Time_in_Ready),要确保字段名正确。
最后可以根据需求调整纵轴的数值格式、条形图的颜色样式等,达到你想要的效果。
内容的提问来源于stack exchange,提问作者IronGem
相关产品推荐
相关产品推荐

