Reporting services 如果字符串在SSRS中为数字,则将字符串转换为十进制,以计算加权平均值
我在SSRS中有一个数据集,其中一列包含小数和字符串值“N/a”。SQL将列强制转换为字符串(varchar(10))。Reporting services 如果字符串在SSRS中为数字,则将字符串转换为十进制,以计算加权平均值,reporting-services,vbscript,Reporting Services,Vbscript,我在SSRS中有一个数据集,其中一列包含小数和字符串值“N/a”。SQL将列强制转换为字符串(varchar(10))。 这是数据集的一个示例: Board Urgency TicketCounty AveResTime AveResolTime Support Open - Priority 2 4 5.766666 N/A Support Priority 1 2
这是数据集的一个示例:
Board Urgency TicketCounty AveResTime AveResolTime
Support Open - Priority 2 4 5.766666 N/A
Support Priority 1 2 1.833333 0.125925
IT Priority 1 3 2.733333 0.875925
IT Priority 2 1 0.000000 0.294444
在总计行中,我需要计算每个板的平均时间的加权平均值。
这是我创建的表达式:
=SUM(Fields!TicketCountByPriority.Value * IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value)=1, CDec(Fields!AverageResolutionTime_BusDays.Value), 0))/SUM(IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value)=1, Fields!TicketCountByPriority.Value, 0))
对于支撑板,显示的值为#Error
对于IT总计,显示的值为NaN
我认为问题在于,当字符串值都是数字且值为“N/A”时,AveraleTime中的字符串值没有被转换,这会抛出一个错误。
当值为“N/A”时,如何将字符串转换为小数,并将值设置为0
我纠正了一个问题,这样,如果所有的值都是数字,则计算加权平均值。
我删除了“=1”
=SUM(Fields!TicketCountByPriority.Value * IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value), CDec(Fields!AverageResolutionTime_BusDays.Value), 0))/SUM(IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value), Fields!TicketCountByPriority.Value, 0))
如果该值为N/A
,则计算中不使用0值,并且我仍然在结果中得到#Error
更新
我使用以下代码得到了要计算的加权平均值:
=IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value), SUM(Fields!TicketCountByPriority.Value * CDec(IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value), Fields!AverageResolutionTime_BusDays.Value, 0)))/SUM(IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value), Fields!TicketCountByPriority.Value, 0)), 0)
我不得不在if语句中进行计算。
我仍然需要处理所有值都是“N/A”的情况,然后正如@Alan所说的,会有一个被零除的错误。表达式的第二部分基本上是说IF
字段!AverageResolutionTime\u BusDays.Value
不是一个数字,除以零。如果让表达式在数值实例中工作,然后将其包装在进行数值测试的if中,可能会更容易。目前无法测试,但类似于
IIF(IsNumeric(Fields!AverageResolutionTime_BusDays.Value), YourWorkingExpressionHere, 0).
如果要显示空白而不是零,可以将最后的零替换为“Nothing”(无引号)您可以检查“TicketCounty”列的数据类型,还是将其简单地包装在CInt()中,以确保两边的数字都是乘/除的。很多次我都遇到了这个错误,只需要在int列上放置一个CInt()!AverageResolutionTime\u BusDays.Value不是一个被零除的数字。如果让表达式在数值实例中工作,然后将其包装在进行数值测试的if中,可能会更容易。目前无法测试,但类似于。IIF(IsNumeric(Fields!AverageResolutionTime\u BusDays.Value),您的工作表达式为0)。如果要显示空白而不是零,可以将最后的零替换为“Nothing”(无引号)。为了消除“被零除”的问题,我将表达式更改为仅分子:
=SUM(Fields!TicketCountByPriority.Value*IIF(IsNumeric(Fields!AverageResolutionTime\u BusDays.Value)、CDec(IIF(IsNumeric(字段!AverageResolutionTime_BusDays.Value),字段!AverageResolutionTime_BusDays.Value,0)),0)
但当分辨率列中的一个值为N/A时,我仍然得到#错误
。我在TicketCount周围添加了CInt
,但该值始终为int且大于0。它不会改变结果。在没有可用数据时添加了N/A
。因此看起来不错。谢谢大家!@AlanSchofield-pos这是我的最终表达式:=SUM(Fields!TicketCountByPriority.Value*IIF(IsNumeric(Fields!AverageResolutionTime\u BusDays.Value)),CDec(IIF(IsNumeric(Fields!AverageResolutionTime\u BusDays.Value)e) ,字段!AverageResolutionTime\u BusDays.Value,0),0))