2015-07-21 56 views
0

我想出现如下的一份报告中创建表的时间分组行:报表生成器3.0 - 通过

数据集基于此查询:

SELECT 
DATENAME(dw, CurrentReadTime) AS 'DAY', 
DATEPART(dw, CurrentReadTime) AS 'DOW', 
CAST(datename(HH, CurrentReadTime) as int) AS 'HOD', 
AVG([Difference]) AS 'AVG' 
FROM 
Consumption 
INNER JOIN Readings ON Readings.[RadioID-Hex] = Consumption.[RadioID-Hex] 
WHERE 
CONCAT([Building], ' ', [Apt]) = @ServiceLocation 
GROUP BY 
CurrentReadTime 
ORDER BY 
DATEPART(DW, CurrentReadTime), 
CAST(DATENAME(HH, CurrentReadTime) AS INT) 

如下从该表中的数据返回:

Data Results

在报表生成器,我加入这个代码报告属性:

Function GetRangeValueByHour(ByVal Hour As Integer) As String 
Select Case Hour 
Case 6 To 12 
GetRangeValueByHour = "Morning" 
Case 12 to 17 
GetRangeValueByHour = "Afternoon" 
Case 17 to 22 
GetRangeValueByHour = "Evening" 
Case Else 
GetRangeValueByHour = "Overnight" 
End Select 
Return GetRangeValueByHour 
End Function 

而这个代码为“行组”:

=Code.GetRangeValueByHour(Fields!HOD.Value) 

当我执行报告,选择了参数目标服务的位置,我得到这样的结果:

Actual Result

正如你会发现,在“时刻”的displayin g在报表属性代码中符合CASE表达式的第一个结果;但是,我确认了所有“HOD”(存储为整数)通过对此结果执行SUM进行分组。

此外,实际表值(.05,.08等)仅返回首次满足VB代码中CASE语句要求的HOD结果。

这些都是我需要解决的事情,但想不通:

  • 为什么不报告属性VB代码显示“上午”,“下午”,“晚上”和“隔夜“在当日时间专栏?
  • 如何将表中的值组合在一起?因此,AVG实际上是指定范围内的所有小时和每周的星期几(周一,周二等6-12,12-18等)的每个AVG的总和。

对于那些仍在阅读,感谢您的协助!如果您需要更多信息,请告诉我。

+0

您是使用表格还是矩阵?你是否在时间列中使用行组表达式('= Code.GetRangeValueByHour(Fields!HOD.Value)')? – stubaker

+0

我正在使用一张桌子。报告属性中的代码在时间列中被调用以对“早晨”,“下午”等进行分组。 我最终更改了“每日时间”的参数,以创建(4)六小时时段。然后,只需将查询中返回的值乘以6即可得到我需要的数字。这就是说,如果你有一个解决方案的原始问题,我仍然非常有兴趣听到如何解决这个问题。 – johnwonderbread

回答

0

我还不确定我是否清楚地了解了您的餐桌设计,但我将其想象为按此表达式分组的单行组:=Code.GetRangeValueByHour(Fields!HOD.Value)。在此基础上设计和上面的数据集,这里就是我会解决你的两个问题:

  • 使用分组表达式为日细胞的时间价值,如:

Expression for Time of Day column

  • 添加一个SUM,并在每周的每一天的值的条件。例如:星期天的表达为=SUM(IIF(Fields!DOW.Value = 1, Fields!AVG.Value, CDec(0)))。这使用CDec(0)而不是0,因为AVG值是小数,SSRS会通过将0解释为int来抛出混合数据类型错误的集合。