在SSRS矩阵中比较IIF中的日期时出现的问题

时间:2017-09-21 10:43:51

标签: sql-server reporting-services

您好我是ssrs的新手,我正在尝试制作一份报告,其中列出了"利用率"根据他们完成的任务量和当天工作的小时数,这两个值由sql查询和"利用率"是报告中的计算字段。

这是以矩阵格式设置的,其中[date]作为列分组,[name]作为行分组,过去的一年是"利用"计算,但在实际预览中仅取消隐藏所选MaxDate参数的过去一周。

我的问题来自于尝试从MaxDate参数计算过去一周每个人的平均利用率。我希望过去一个月也能这样做。

看起来我尝试的所有代码,充其量只是在IFF为真时产生#Error。

以下是我尝试过的一些事情:

       =Sum(IIF(DateDiff("d",Fields!Date.Value, Parameters!MaxDate.Value) < 7, Sum(Fields!Utilisation.Value), ""))
       =IIF(DateDiff("d",CDate(Fields!Date.Value), CDate(Parameters!MaxDate.Value)) < 7, Sum(Fields!Utilisation.Value), "")
       =IIF(DateAdd("d",-7, Parameters!MaxDate.Value) <= Fields!Date.Value, Sum(Fields!Utilisation.Value), "")

我已经尝试了很多,这些只计算总数,但是一旦我开始工作,我会用一个数来找到平均数。

我最好的猜测是,IIF语句只查看矩阵中的第一个日期,然后比较该日期以查看条件是否为真,因为如果我这样做:

=IIF(Fields!Date.Value >= "2000/09/20", Sum(Fields!Utilisation.Value), "")

它返回所有利用率字段的总和,因为每行的第一个日期在&#34; 2000/09/20&#34;之后。

有人有任何建议吗?

谢谢

UPDATE:

类似的东西:

=SUM(IIF(IsNothing(Fields!Date.Value), 0, IIF(DateDiff("d", Fields!Date.Value, Parameters!MaxDate.Value) < 7, 1, 0)), "name")

&#34;工作&#34;,因为它提供了过去一周非空利用率的天数的正确计数,但只要将该1转换为字段就会出错。

我尝试通过让sql通过语句中添加的W和M代码来决定当天是过去一周还是一个月。我这样做是因为问题在于日期字段,但即使使用代码,它似乎并没有真正起作用。这是SSRS的一些基本限制,还是我只是一直在搞乱。

=SUM(IIF(IsNothing(Fields!Date.Value), 0, IIF(Fields!Code.Value = "W" , (Fields!TaskTime.Value /Fields!AvailableHours.Value), 0)))

=SUM(IIF(IsNothing(Fields!Date.Value), 0, IIF(Fields!Code.Value = "W" , SUM(Fields!Utilisation.Value), 0)))

=Sum(IIF(Fields!Code.Value = "W", SUM(Fields!TaskTime.Value), 0))

更新

好的:

=(IIF(IsNothing(Fields!AvailableHours.Value),"" , SUM(SUM(Fields!TaskTime.Value / Fields!AvailableHours.Value)) / (SUM(Fields!AvailableHours.Value)/7)))

将从整个365天数据集中获得年度平均值,但出于某种原因

=(IIF(IsNothing(Fields!WeekCode.Value),"" , SUM(SUM(Fields!TaskTime.Value / Fields!AvailableHours.Value)) / (SUM(Fields!AvailableHours.Value)/7)))

只有所选日期一周内的那些标有星期代码,其余的都是空的,不会工作???我不明白发生了什么或为什么似乎有这些奇怪的限制

2 个答案:

答案 0 :(得分:0)

好的,所以我没有找到一个确切的解决方案,但我确实找到了解决方法。我猜这个问题可能来自在ssrs中对计算字段使用sum,以一种可以说是效率低下的方式解决这个问题,在sql中我创建了2个计算的列,weekUtilisation和MonthUtilisation,如果行的日期在一周之内日期变量的利用率是在那里计算的,其余的是null,而且对于monthUtilisation来说是相同的但是......在变量的一个月内。这使得我只能在SSRS中实现总和(WeekUtilisation)和sum(MonthUtilisation)实际工作,然后除以连续非空数量的计数,这给了我想要的平均值。无论如何,在sql中执行它可能是一个更快的解决方案。

答案 1 :(得分:0)

我发现#Error代码意味着您的代码是正确的并且能够编译但产生错误。这通常是由数学方程式引起的,例如除以零或尝试用模糊数据类型计算。

尝试将所有字段和参数强制转换为比较所需的数据类型。

例如你在哪里:

IIF(DateDiff("d", Fields!Date.Value, Parameters!MaxDate.Value) < 7, 1, 0)

DO

IIF(DateDiff("d", CDATE(Fields!Date.Value), CDATE(Parameters!MaxDate.Value)) < 7, 1, 0)

你在哪里

SUM(SUM(Fields!TaskTime.Value / Fields!AvailableHours.Value))

不确定为什么要两次SUM,但是

SUM(CINT(Fields!TaskTime.Value) / CINT(Fields!AvailableHours.Value))

并确保您除以的值不为零。