Report Builder 3.0 - 按时间对行进行分组

时间:2015-07-21 15:08:42

标签: sql-server vb.net reporting-services reportbuilder3.0

我正在尝试在报告中创建一个表格,如下所示:

Target Table

数据集基于此查询:

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

正如您将注意到的那样,"时间和#34;正在显示报告属性代码中符合CASE表达式的第一个结果;但是,我确认了所有" HOD" (存储为整数)通过对此结果执行SUM来组合在一起。

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

这些是我需要解决的问题,但无法弄清楚:

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

对于仍在阅读的人,感谢您的帮助!如果您需要其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我仍然不确定我是否对您的表格设计有清晰的了解,但我想象这是一个按照此表达式分组的单行组:=Code.GetRangeValueByHour(Fields!HOD.Value)。基于此设计和上面的数据集,以下是我将如何解决您的两个问题:

  • 将分组表达式用于Time of Day单元格的值,例如:

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来抛出混合数据类型错误的集合。